2011-09-02 46 views
4

我有一個單行usort函數:返回0
我試圖用它stdClass的對象的數組,它改變
它們的順序,這怎麼可能?usort改變陣列的順序

+0

顯示一些代碼 - –

+0

與uasort試了一下爲好,還是改變了順序 – Asaf

+0

http://pastebin.com/JPvvxJaC - 改變uasort到usort,它仍然會改變順序 – Asaf

回答

8

您認爲該屬性稱爲stability:一個穩定排序算法不會改變相等元素的順序。

php的排序功能是不是穩定(因爲非穩定排序可能會稍微快一點)。從documentation of usort

如果兩個成員比較平等,他們的數組排序,以便爲 不確定的。

如果你想要一個穩定的排序算法,你必須implement it yourself

1

這是因爲這個功能的意思是「我真的不在乎它們是如何排序的,它們與我相等」。有了這個簡單的示例中,我收到相反的數組:

function sortaaa($a,$b) {return 0;} 
$array = array(1,2,3,4,5); 
usort($array,"sortaaa"); 
var_dump($array); 
//prints array(5) { [0]=> int(5) [1]=> int(4) [2]=> int(3) [3]=> int(2) [4]=> int(1) } 

所以它看起來像PHP中的循環功能usort以相反的順序排列。所以,請注意usortmanual指出

如果兩個成員比較平等,他們的數組排序才能是不確定的。

+0

你會建議作爲一個解決方案? – Asaf

+0

這取決於您解決方案的含義。你想實現什麼? – J0HN

+0

@Asaf如果穩定性是這樣的問題,推出自己的分揀程序。添加[鏈接](http://www.php.net/manual/en/function.usort.php#38827)到[我的答案](http://stackoverflow.com/questions/7283877/usort-改變陣列階/ 7283968#7283968)。 – phihag