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