Php 根据值对关联数组的键进行排序(函数中的错误)

Php 根据值对关联数组的键进行排序(函数中的错误),php,associative-array,Php,Associative Array,我想根据关联数组的键的值对其进行排序。(从上到下为1、2、3……)。具有相同值的键将具有相同的等级 这里的函数getRanks()用于返回一个数组,该数组包含键和列(数字) 我希望它会像这样返回(这是按降序排序的值) 这是一件简单的事情,您可以使用下面给出的php数组函数检查示例来完成 <?php $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"); as

我想根据关联数组的
键的值对其进行排序。(从上到下为1、2、3……)。具有相同值的键将具有相同的等级

这里的函数
getRanks()
用于返回一个数组,该数组包含
(数字)

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


这是一件简单的事情,您可以使用下面给出的php数组函数检查示例来完成

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>

您的方法似乎过于复杂。在我的版本中,我保留了与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;
}
请参见此处的演示:


在稍加修改的版本中,您还可以按降序排列,请参见此处:

我还尝试了另一种方法。 我认为这可能不是一个好的解决方案,因为内存和CPU时间消耗很高

对于小型阵列(在我的例子中),它可以正常工作

(我之所以发布,是因为这可能是一个答案)

它创建唯一值的数组,并相应地获取
等级


@AnuragSrivastava的可能重复项我已按值排序。我需要根据
$ranks
数组中的这些排序值填充列。建议的副本不是我的问题。这不是我要求的。我已经对数组进行了排序。您可以发布您需要的初始数组和结果数组吗?我已经提供了预期结果。你的答案对数组进行排序,这不是我需要的。
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>
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;
}
$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);
    arsort($tmp_arr);
    $uniq_vals = array_values(array_unique($tmp_arr)); // unique values indexed numerically from 0

    foreach ($tmp_arr as $k => $v) {
        $tmp_arr[$k] = array_search($v, $uniq_vals) + 1; //as rank will start with 1
    }
    return $tmp_arr;
}