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

Reply via email to