php - 根据值对关联数组的键进行排名(函数错误)
问题描述
我想根据它们的值对phpkeys
中的关联数组进行排名。(从上到下为 1、2、3....)。具有相同值的键将具有相同的等级。
这里的函数
getRanks()
旨在返回一个包含keys
和ranks
(数字)的数组。我希望它像这样返回(这是按降序排序的值)
大批 ( [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
推荐阅读
- python - 如何在排序日期(降序)的数据框中查找和添加缺失的日期?
- ubuntu - 有没有办法在 Puppeteer for Firefox 中使用代理?
- reactjs - @parcel/transformer-babel:意外的令牌,预期的“;”
- python - Swift 动态设置新的类属性
- python - 如何在此 html 代码上执行网页抓取?
- firebase - Firebase 网络客户端 gzip 上传到 Cloud Storage
- html - 按钮省略选项
- python - 使用正则表达式删除字符串python的一部分
- julia - 使用 LsqFit 进行多变量输出?
- acl - HAProxy - 算术运算支持