Req #53341 [Com]: Add a stable sorting flag to sort functions (uasort)

From: Date: Tue, 14 Jun 2016 12:31:07 +0000
Subject: Req #53341 [Com]: Add a stable sorting flag to sort functions (uasort)
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-201602@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=53341&edit=1 ID: 53341 Comment by: mdg12v at gmail dot com Reported by: goetas at lignano dot it Summary: Add a stable sorting flag to sort functions (uasort) Status: Open Type: Feature/Change Request Package: Arrays related Operating System: any PHP Version: 5.3.3 Block user comment: N Private report: N New Comment: this bug still appears on php 7.0.6, it was working right on php 5.6. magento totals sorting component calculating wrong total because of this bug. i bet many places affected because of this bug Previous Comments: ------------------------------------------------------------------------ [2016-01-29 15:12:15] cw at clement dot hk @cmb, this is more like a feature request than a bug report. ------------------------------------------------------------------------ [2015-08-13 13:31:12] cmb@php.net AFAIK PHP 7 uses a stable sort algorithm for small arrays (< 16), but for larger arrays the algorithm is still not stable. Furthermore PHP makes no guarantee whether sorting with *sort() is stable or not. ------------------------------------------------------------------------ [2015-08-13 12:59:01] cw at clement dot hk Please note that this is fixed since PHP 7, so this issue can be close now. ------------------------------------------------------------------------ [2015-05-08 21:23:05] cmb@php.net While there might be use cases demanding a stable sort, this is clearly none of them. Just sort the array with a single usort(), what is faster, by the way: <?php $a = array( array("l"=>"B", "n"=>2), array("l"=>"A", "n"=>1), array("l"=>"C", "n"=>3), array("l"=>"E", "n"=>5), array("l"=>"D", "n"=>4), ); usort($a, function($a1, $a2){ // sort even first if($a1["n"]%2===0 && $a2["n"]%2!==0){ return -1; }elseif($a2["n"]%2===0 && $a1["n"]%2!==0){ return 1; }else{// alpha sort return strcmp($a1["l"],$a2["l"]); } }); print_r($a); ------------------------------------------------------------------------ [2014-03-04 15:43:01] cw at clement dot hk You can use this before the bug is fixed. Clement Wong function stable_uasort(&$array, $cmp_function) { if(count($array) < 2) { return; } $halfway = count($array) / 2; $array1 = array_slice($array, 0, $halfway, TRUE); $array2 = array_slice($array, $halfway, NULL, TRUE); stable_uasort($array1, $cmp_function); stable_uasort($array2, $cmp_function); if(call_user_func($cmp_function, end($array1), reset($array2)) < 1) { $array = $array1 + $array2; return; } $array = array(); reset($array1); reset($array2); while(current($array1) && current($array2)) { if(call_user_func($cmp_function, current($array1), current($array2)) < 1) { $array[key($array1)] = current($array1); next($array1); } else { $array[key($array2)] = current($array2); next($array2); } } while(current($array1)) { $array[key($array1)] = current($array1); next($array1); } while(current($array2)) { $array[key($array2)] = current($array2); next($array2); } return; } ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=53341 -- Edit this bug report at https://bugs.php.net/bug.php?id=53341&edit=1

« previous php.bugs (#201602) next »