我想对关联数组进行排序,并且有一个内置函数可以实现相同的功能,即arsort()
,但这个函数的问题是,当值相同时,它不能保持原始的键顺序。例如
$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数组的重复-先按值排序,然后按键排序?。在这个问题中,它要求相同的数值按字母顺序排序,但在我的问题中,如果值相同,我要求按原始顺序排序。
可能有一种更有效的方法可以做到这一点,但我认为这应该可以在具有相同值的组中维护原始键顺序。我将从这个数组开始,例如:
$l = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, 'g' => 5, 'e' => 5, 'f' => 5 ];
按值对数组进行分组:
foreach ($l as $k => $v) { $groups[$v][] = $k; }
由于
foreach
循环按顺序读取数组,密钥将按正确顺序插入各自的组中,这将产生:[1 => ['a'], 2 => ['b', 'c'], 4 => ['d'], 5 => ['g', 'e', 'f'] ];
按关键字按降序对组进行排序:
krsort($groups);
使用嵌套循环从分组数组重新组装已排序的数组:
foreach ($groups as $value => $group) { foreach ($group as $key) { $sorted[$key] = $value; } }
您可以使用array_multisort
。该函数可能有点令人困惑,而且很难解释,但它会对多个数组进行排序,并且提供的第一个数组会根据后续数组的顺序进行排序。
尝试:
array_multisort($l, SORT_DESC, array_keys($l));
请参阅此处的示例:https://3v4l.org/oV8Od
它按值降序对数组进行排序,然后通过对数组键的排序进行更新。