我正在制定一个排行榜,根据积分将最高得分者排在第一,第二和第三位。现在我正在处理一个看起来像这样的排序数组(但可能是无限长度的无限点值):
$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
)
有什么想法吗?
答案 0 :(得分: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],$ output in $ output [1]等等。代码仅限于3个第一名。
ps:更新以处理第三位的领带
答案 1 :(得分: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
。
答案 2 :(得分: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>';
?>