php - 根据关联数组的值对键进行排名(函数错误)

标签 php associative-array

我想对 keys 进行排名 中的关联数组基于他们的值(value)观。 (从上到下依次为 1、2、3...)。具有相同值的键将具有相同的排名。

Here function getRanks() is meant to return an array containing keys and the ranks (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/

相关文章:

php - PhalconPHP 数据库事务在服务器上失败

php - 如何设置正确的codeigniter base url?

Javascript 对象与 JScript 字典

php - "Push"循环中关联数组末尾的对象

javascript - 在 JavaScript 关联数组中动态创建键

php - 用户是否有一种简单的方法可以从浏览器打印 Flash(打开 Flash 图表)?

php - 如何使用 PHP 7 和 MySQL 将文件从 POST 插入到 longblob 列中?

php - 在特定类别的 MySQL 列中查找具有相同值的行

javascript - 如何创建 Javascript 哈希表/关联数组原型(prototype)

php - 如何从 foreach 循环创建关联数组?