我有一个示例数组:
$a = array(
5 => 35,
16 => 22,
7 => 22,
3 => 22,
11 => 22,
9 => 27,
);
我希望按值排序并记住它的键。 我预期的结果是:
$a = array(
16 => 22,
7 => 22,
3 => 22,
11 => 22,
9 => 27,
5 => 35,
);
所以我的第一个想法是:asort
!
好的,我做了
asort($a);
但不是 - 它不只是将5 => 35
移动到数组的末尾。
它将我的数组改为:
$a = array(
11 => 22,
3 => 22,
7 => 22,
16 => 22,
9 => 27,
5 => 35
);
你知道吗?具有相同值的键是反向排序的。为什么?
答案 0 :(得分:10)
您不能指望某个排序顺序为相等的值。来自PHP manual on Sorting Arrays:
如果这些排序函数中的任何一个将两个成员评估为相等,则订单未定义(排序不稳定)。
答案 1 :(得分:2)
“为什么”是另一个问题 但它实际上做了你要求的,不是吗? 关键顺序未确定 如果您想要某些键的顺序,您应该在运动条件中说明它
答案 2 :(得分:2)
http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
简而言之,确保已经排序的键的顺序保持不变将花费计算时间(并且无论是谁在PHP设计该功能都认为它不值得)
答案 3 :(得分:1)
根据排序算法,它可能以另一种方式开始排序,而不仅仅是检测它应该只移动那一对。但它最终得到了一个有效排序的数组维护键/值。他们只看起来交换,因为你有4个键值为22
。