Req->Doc #51229 [Opn->Csd]: consecutives sorting with usort and uasort
| From: | cmb@php.net | 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&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