从平面数组中获取 N 个最高分,并在出现平局时允许每个合格分数包含无限个元素

问题描述 投票:0回答:4

我正在开发一个排行榜,根据分数将得分最高的选手分为第一、第二和第三位。现在我正在使用一个看起来像这样的排序数组(但可能具有无限长度和无限点值):

$scores = Array
    (
        ["bob"] => 20
        ["Jane"] => 20
        ["Jill"] => 15
        ["John"] => 10
        ["Jacob"] => 5
    )

我想我可以使用一个简单的切片或块,但我想允许连接,并忽略任何不适合前三个位置的点,如下所示:

$first = Array
    (
        ["bob"] => 20
        ["Jane"] => 20
    )

$second = Array
    (
        ["Jill"] => 15
    )

$third = Array
    (
        ["John"] => 10
    )
php arrays sorting grouping rank
4个回答
3
投票
  $arr = array(
      "Jacob" => 5,
      "bob" => 20,
      "Jane" => 20,
      "Jill" => 15,
      "John" => 10,
  );
  arsort($arr);
  $output = array();
  foreach($arr as $name=>$score)
  {
      $output[$score][$name] = $score;
      if (count($output)>3) 
      {
          array_pop($output); 
          break;
      }
  }
  $output = array_values($output); 
  var_dump($output);

$first 将在 $output[0] 中,$second 将在 $output[1] 中,依此类推。代码仅限于前 3 个位置。

ps:更新处理第三名的平局


1
投票

我会做类似的事情:

function chunk_top_n($scores, $limit)
{
  arsort($scores);
  $current_score = null;
  $rank = array();
  $n = 0;

  foreach ($scores as $person => $score)
  {
    if ($current_score != $score)
    {
      if ($n++ == $limit) break;
      $current_score = $score;
      $rank[] = array();
      $p = &$rank[$n - 1];
    }

    $p[$person] = $score;
  }

  return $rank;
}

它对数组进行排序,然后创建编号组。一旦达到限制,它就会中断。

如果您使用分数作为数组的键,则可以使用更少的代码来完成此操作,但上述方法的好处是它可以在第一次时完全按照您想要的方式创建数组。

如果您不介意对原始内容进行排序,也可以通过引用传递

$scores


0
投票

这是我的尝试:

<?php
function array_split_value($array)
{
    $result = array();
    $indexes = array();

    foreach ($array as $key => $value)
    {
        if (!in_array($value, $indexes))
        {
            $indexes[] = $value;
            $result[] = array($key => $value);
        }
        else
        {
            $index_search = array_search($value, $indexes);
            $result[$index_search] = array_merge($result[$index_search], array($key => $value));
        }
    }

    return $result;
}

$scores = Array(
    'bob' => 20, 
    'Jane' => 20, 
    'Jill' => 15, 
    'John' => 10, 
    'Jacob' => 5
);

echo '<pre>';
print_r(array_split_value($scores));
echo '</pre>';
?>

0
投票

按分数排序,然后过滤和分组:演示

$limit = 3;
arsort($array);
$result = [];
foreach ($array as $k => $v) {
    if (count($result) === $limit && !isset($result[$v])) {
        break;
    }
    $result[$v][$k] = $v;
}
var_export(array_values($result));

过滤和分组,然后按分数组排序:演示

$limit = 3;
$result = [];
foreach ($array as $k => $v) {
    if (isset($result[$v])) {
        $result[$v][$k] = $v;
        continue;
    }
    if (count($result) === $limit) {
        $min = min(array_keys($result));
        if ($v > $min) {
            unset($result[$min]);
        }
    }
    $result[$v][$k] = $v;
}
krsort($result);
var_export(array_values($result));
© www.soinside.com 2019 - 2024. All rights reserved.