usort descending

000 picture 000 · Jan 26, 2013 · Viewed 43.6k times · Source

When i try to apply the below code from here

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

it gives me results in ascending order.

Output:

0
0
0
0
0
0.29
1.09
6.33

On swapping $a and $b it gives the results in descending order except one value

usort($myArray, function($a, $b) {
    return $b['order'] - $a['order'];
});

Output:

6.33
1.09
0
0
0
0
0.29
0

i want to have the results in the below order:

6.33
1.09
0.29
0
0
0
0
0

How do i achieve the same.?

Answer

Gareth Cornish picture Gareth Cornish · Jan 26, 2013

My first guess is that usort expects an integer response, and will round off your return values if they are not integers. In the case of 0.29, when it is compared to 0, the result is 0.29 (or -0.29), which rounds off to 0. For usort, 0 means the two values are equal.

Try something like this instead:

usort($myArray, function($a, $b) {
    if($a['order']==$b['order']) return 0;
    return $a['order'] < $b['order']?1:-1;
});

(I think that's the correct direction. To reverse the order, change the < to >)