2012-01-26 143 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>'; 
?>