Edit report at http://bugs.php.net/bug.php?id=51229&edit=1
ID: 51229 Comment by: kanea at free dot fr Reported by: kanea at free dot fr Summary: consecutives sorting with usort and uasort Status: Open Type: Feature/Change Request Package: Arrays related Operating System: All PHP Version: 5.2.13 New Comment: Yes i have seen that's note and read the source code to understand how that's function. This seems that the new logic is more efficient. Maybe, could it be more visible and present in all u*sort, because uksort and uasort have the same behavior and this it not documented (I work with ua). For the solution, i have already make the change in my code. But perhaps this can be too documented with best practices (one or two afternoon to recode my function) and understand the solution to organize a liste. Best regards Previous Comments: ------------------------------------------------------------------------ [2010-03-10 16:11:35] peter at f-is dot eu This behavior is documented: "Note: If two members compare as equal, their order in the sorted array is undefined." You should adapt your comparison function so it checks on both a AND b, in one function. ------------------------------------------------------------------------ [2010-03-07 17:52:45] kanea at free dot fr Description: ------------ on an array with collection of the same object the object have 2 property a et b Exemple: [ object:{a=3, b=2} object:{a=0, b=2} object:{a=2, b=3} object:{a=1, b=2} If you make a first sort with the good fonction and usort on property a, you obtain [ object:{a=0, b=2} object:{a=1, b=2} object:{a=2, b=3} object:{a=3, b=2} ] The result is that you intend Now if you make a second sort with another function and usort on property b, you obtain [ object:{a=3, b=2} object:{a=1, b=2} object:{a=0, b=2} object:{a=2, b=3} ] The result is not you can wait. I think that's because the read of the array is make in inverse way. A possible solution is to mark the placed elements. And not move elements not tested before or after them the marked element. Best Regards Test script: --------------- <?php function compa($a, $b){ if($a['a']>$b['a']) return 1; else return ($a['a']<$b['a'])?-1:0; } function compb($a, $b){ if($a['b']>$b['b']) return 1; else return ($a['b']<$b['b'])?-1:0; } $a = array(array('a'=>1, 'b'=>2), array('a'=>2, 'b'=>3), array('a'=>3, 'b'=>2), array('a'=>0, 'b'=>2), array('a'=>4, 'b'=>2)); usort($a, 'compa'); print_r($a); usort($a, 'compb'); print_r($a); ?> Expected result: ---------------- Array ( [0] => Array ( [a] => 0 [b] => 2 ) [1] => Array ( [a] => 1 [b] => 2 ) [2] => Array ( [a] => 3 [b] => 2 ) [3] => Array ( [a] => 2 [b] => 3 ) ) Actual result: -------------- Array ( [0] => Array ( [a] => 3 [b] => 2 ) [1] => Array ( [a] => 1 [b] => 2 ) [2] => Array ( [a] => 0 [b] => 2 ) [3] => Array ( [a] => 2 [b] => 3 ) ) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=51229&edit=1