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