Php 按值拆分数组

Php 按值拆分数组,php,arrays,split,Php,Arrays,Split,我正在制作一个排行榜,根据得分将得分最高的球员拉到第一、第二和第三的位置。现在,我正在处理一个排序数组,它看起来像这样(但可能是无限长的,具有无限的点值): 我想我可以使用一个简单的切片或块,但我想考虑到关系,忽略任何不适合前三位的点,如: $first = Array ( ["bob"] => 20 ["Jane"] => 20 ) $second = Array ( ["Jill"] => 15

我正在制作一个排行榜,根据得分将得分最高的球员拉到第一、第二和第三的位置。现在,我正在处理一个排序数组,它看起来像这样(但可能是无限长的,具有无限的点值):

我想我可以使用一个简单的切片或块,但我想考虑到关系,忽略任何不适合前三位的点,如:

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

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

$third = Array
    (
        ["John"] => 10
    )
有什么想法吗

  $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个第一位


注:更新以处理第三名的领带问题

我会做如下操作:

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

以下是我的做法:

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


在这种情况下,两个人排在第一位,然后一个人排在第三位(跳过第二位)?几乎可以。。。但它会在第三组中遗漏领带。@Matthew谢谢:)没想到,可以很容易地修改:)
<?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>';
?>