Req->Doc #51229 [Opn->Csd]: consecutives sorting with usort and uasort

From: Date: Sat, 25 Jun 2016 14:42:23 +0000
Subject: Req->Doc #51229 [Opn->Csd]: consecutives sorting with usort and uasort
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-13605@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=51229&edit=1 ID: 51229 Updated by: cmb@php.net Reported by: kanea at free dot fr Summary: consecutives sorting with usort and uasort -Status: Open +Status: Closed -Type: Feature/Change Request +Type: Documentation Problem -Package: Documentation problem +Package: Arrays related Operating System: All PHP Version: 5.2.13 -Assigned To: +Assigned To: cmb Block user comment: N Private report: N New Comment: This bug has been fixed in the documentation's XML sources. Since the online and downloadable versions of the documentation need some time to get updated, we would like to ask you to be a bit patient. Thank you for the report, and for helping us make our documentation better. Previous Comments: ------------------------------------------------------------------------ [2016-06-25 14:42:14] cmb@php.net Automatic comment from SVN on behalf of cmb Revision: http://svn.php.net/viewvc/?view=revision&amp;revision=339490 Log: Fix #51229: consecutives sorting with usort and uasort ------------------------------------------------------------------------ [2010-03-11 14:06:07] kanea at free dot fr 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 ------------------------------------------------------------------------ [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 https://bugs.php.net/bug.php?id=51229&edit=1

« previous php.doc.bugs (#13605) next »