2011-03-21 159 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),这应该是有意义的。

​​