我想对 keys
进行排名php 中的关联数组基于他们的值(value)观。 (从上到下依次为 1、2、3...)。具有相同值的键将具有相同的排名。
Here function
getRanks()
is meant to return an array containingkeys
and theranks
(number).I expect it to return like this (this is sorted value wise in descending)
Array ( [b] => 1 [a] => 2 [d] => 3 [c] => 3 [e] => 4 )
分配 ranks
时出现问题(值)在 $ranks array
中将被退回。
我做错了什么?这些循环到底有什么作用吗?
代码:
$test = array('a'=> 50, 'b'=>60, 'c'=>20, 'd'=>20, 'e'=>10);
$json = json_encode($test);
print_r(getRanks($json));
function getRanks($json) {
$tmp_arr = json_decode($json, TRUE);
$ranks = array();
uasort($tmp_arr, function($a, $b){
return $a == $b ? 0 : $a > $b ? -1 : 1; //descending
});
$keys = array_keys($tmp_arr); //after sorting
$ranks = array_fill_keys($keys, 0); //copy keys
$ranks[$keys[0]] = 1; //first val => rank 1
//------- WORKS FINE UNTIL HERE ------------------
// need to fix the ranks assignment
for($i=1; $i<count($keys)-1; $i++) {
for($j=$i; $j < count($keys)-1; $j++) {
if($tmp_arr[$keys[$j]] == $tmp_arr[$keys[$j+1]]) {
$rank[$keys[$j]] = $i;
}
}
}
return $ranks;
}
最佳答案
您的方法似乎不必要地复杂。在我的版本中,我保留了与 json 相关的复制部分,但以更简单的方式完成了它:
function getRanks($json) {
$tmp_arr = json_decode($json, TRUE);
asort($tmp_arr);. // sort ascending
$i=0; $lv=null;$ranks = array();
foreach ($tmp_arr as $k=>$v) {
if ($v>$lv){ $i++; $lv=$v;}
$ranks[$k]=$i;
}
return $ranks;
}
在此处查看演示:https://rextester.com/LTOA23372
在稍作修改的版本中,您还可以按降序排列,请参见此处:https://rextester.com/HESQP10053
关于php - 根据关联数组的值对键进行排名(函数错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56197996/