2011-03-21 176 views
3
$arr =array(
    28 => 23, 
    26 => 23, 
    15 => 12, 
    29 => 12, 
    1 => 12, 
    16 => 15, 
    30 => 15, 
    11 => 12, 
    8 => 23, 
    33 => 23 
); 

如何排序是這樣的:PHP如何先按鍵然後按值排序關聯數組?

8 => 23 
26 => 23 
28 => 23 
33 => 23 
16 => 15 
30 => 15 
1 => 12 
11 => 12 
15 => 12 
29 => 12 
+0

你的數組只是按值排序,是嗎? – JohnP 2011-03-21 12:58:09

+0

你必須編寫你的函數,並使用它作爲uksort()回調 – Yaronius 2011-03-21 13:04:04

+0

我已經將你的兩個賬戶合併在一起。 [請閱讀有關基於Cookie的帳戶的此Faq條目。](http://meta.stackexchange.com/questions/44557/why-should-i-register-my-account/44562#44562)此外,StackOverflow不是一個論壇;如果您有新問題,請提出一個新問題。如果你想在你的問題中包含更多信息,請[編輯](http://stackoverflow.com/posts/5377853/edit)。如果您想與其中一位已回答的人進行互動,您可以留下評論。 – Will 2011-03-21 16:03:29

回答

5

使用uksort,但使陣列可爲按值二級比較比較功能。使其成爲全球變量將是最快最骯髒的方式。

+2

不錯的解決方案。使用閉包並將數組的副本傳入並使用會很好......請注意,在將數組傳遞給閉包之前,您實際上必須將該數組傳遞給另一個變量。 – Jacob 2011-03-21 13:12:47

0

它很容易。首先使用ksort,然後使用asort作爲新的排序數組。你會發現你的結果。

+2

PHP的數組排序功能使用不穩定的快速排序。所以這不能得到保證。 – Jacob 2011-03-21 13:08:12

+0

@Jacob。對不起,我不明白你的意思。請解釋我並糾正我的錯誤... – 2011-03-21 13:09:53

+1

請參閱[穩定性](http://en.wikipedia.org/wiki/Sorting_algorithm#Classification)。在快速排序中,如果兩個元素相同,則不能保證保持其原始順序。 – Jacob 2011-03-21 13:14:06

4

您可以使用uksort(),它使自定義回調可以查看鍵和間接關聯的值。然後,決定進行哪些比較並返回合適的大於或小於或等於零的值來影響排序順序是一件簡單的事情。

下面是一個在臨時變量周圍使用閉包的示例(請參閱Jacob's comment),這應該是有意義的。

​​