2012-01-26 114 views
2

我正在开发一个排名第一,第二和第三位的积分榜。现在我有一个排序的数组,看起来像这样的工作(但可能是具有无限点值无限长):按值排列阵列

$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

在这种情况下,你会不会有两个人第一名,然后一个第三(跳过第二位)? –

回答

2
$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:更新,以解决领带上的第三位

+0

几乎可行......但它会在第三组中排除联系。 – Matthew

+0

@Matthew谢谢:)没想过,可以很容易修改:)) – Cheery

+0

只是把戏!感谢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>'; 
?>