2010-09-08 98 views
3

我有一个例子数组:PHP的asort不能正常工作?

$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

我不看不到问题:'asort()'不能保证具有相同值的元素的特定排序顺序。 – 2010-09-08 10:12:44

+4

我猜'asort'使用的排序算法不是[stable](http://en.wikipedia.org/wiki/Sorting_algorithm#Stability)。 – Gumbo 2010-09-08 10:13:32

回答

10

你不能指望某个排序顺序相同的值。从PHP manual on Sorting Arrays

如果任何这些排序函数评估两个成员相等,那么顺序是未定义的(排序不稳定)。

2

“为什么”是另一个问题。
但它实际上做了你所要求的,不是吗?
按键顺序未确定。
如果你想要一定的按键顺序,你应该在练习条件中说明它

+0

重点是我需要保持键顺序。 – hsz 2010-09-08 10:14:16

+1

@ hsz您可能需要构建一个手动函数,以在第一次排序后重新对相同值的键进行排序。我无法在[list](http://www.php.net/manual/en/array.sorting)中看到一个现成的函数 - 或适合于此的用户定义的函数。 PHP)(但我可能是错的) – 2010-09-08 10:18:37

1

根据排序算法,它可能开始以另一种方式排序,而不仅仅是检测它应该只移动该单个对。但它最终得到了一个有效排序的数组来维护键/值。他们只看交换因为你有4个键值为22