首页 > 解决方案 > 根据值对关联数组的键进行排名(函数错误)

问题描述

我想根据它们的值对keys中的关联数组进行排名。(从上到下为 1、2、3....)。具有相同值的键将具有相同的等级。

这里的函数getRanks()旨在返回一个包含keysranks(数字)的数组。

我希望它像这样返回(这是按降序排序的值)

大批
        (
            [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;
}

标签: phpassociative-array

解决方案


您的方法似乎不必要地复杂。在我的版本中,我保留了与 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


推荐阅读