2010-09-08 51 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