按值拆分数组

3

我正在制作一个排行榜,根据分数将得分最高的人排在第一、第二和第三名。目前我正在处理一个已排序的数组,其形式如下(但它可以是无限长度且具有无限点值):

$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
    )

有什么想法吗?

2
在这种情况下,你会有两个人并列第一名,然后跳过第二名只有一个人获得第三名吗? - Mr. Llama
3个回答

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] 中,以此类推... 代码限制前三个位置。

ps:更新以处理第三名的并列情况。


几乎可以工作...但它将会忽略第三组中的平局。 - Matthew
@Matthew 谢谢 :) 我没想到,可以很容易地修改 :)) - Cheery

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>';
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接