按值降序对关联数组进行排序,并在值相同时保留顺序

时间:2016-07-18 21:52:39

标签: php arrays sorting

我想对一个关联数组进行排序,并且有一个内置函数来实现相同的viz。 arsort(),但此函数的问题在于,当值相同时,它不会保持原始键顺序。 e.g。

$l = [
    'a' => 1,
    'b' => 2,
    'c' => 2,
    'd' => 4,
    'e' => 5,
    'f' => 5
];

我想要的结果是:

$l = [
    'e' => 5,
    'f' => 5,
    'd' => 4,
    'b' => 2,
    'c' => 2,
    'a' => 1
];

arsort()以降序给出结果,但在值相同时随机排列元素。 此问题与PHP array multiple sort - by value then by key?不重复。在那个问题中,它要求按字母顺序对相同的数值进行排序,但在我的问题中,我要求值按照原始顺序进行排序(如果它们相同)。

2 个答案:

答案 0 :(得分:3)

可能有一种更有效的方法可以做到这一点,但我认为这应该可以在相同值的组内保持原始键顺序。我将从这个数组开始,例如:

$l = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, 'g' => 5, 'e' => 5, 'f' => 5 ]; 
  1. 按值对数组进行分组:

    foreach ($l as $k => $v) {
        $groups[$v][] = $k;
    }
    

    因为foreach循环按顺序读取数组,所以键将以正确的顺序插入各自的组中,这将产生:

    [1 => ['a'], 2 => ['b', 'c'], 4 => ['d'], 5 => ['g', 'e', 'f'] ];
    
  2. 按键按降序对组进行排序:

    krsort($groups);
    
  3. 使用嵌套循环从分组数组中重新组装已排序的数组:

    foreach ($groups as $value => $group) {
        foreach ($group as $key) {
            $sorted[$key] = $value;
        }
    }
    

答案 1 :(得分:1)

您可以使用array_multisort。该函数可能有点令人困惑,并且很难解释,但是它会对多个数组进行排序,并且提供的第一个数组会根据后续数组的顺序进行排序。

尝试:

array_multisort($l, SORT_DESC, array_keys($l));

请参阅此处的示例:https://3v4l.org/oV8Od

它按降序值对数组进行排序,然后通过数组键上的排序进行更新。