usort descending

48,811

Solution 1

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 >)

Solution 2

Just switch the $a and $b around as follows;

function sort($a, $b){ 
return strcasecmp($b->order, $a->order);
}
usort($myArray, "sort");

Solution 3

using the space ship operator in php 7 (and over):

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

would return the array sorted in ascending order. reversing the comparison will return it in descending.

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

Solution 4

I know this is old, but hopefully this helps someone. Easiest way to set descending order, is to just multiply by negative one (-1) as shown below. Worked well for me, with text.

function DESC($a, $b)
{
    return strcmp($a["text"], $b["text"])*-1;
}

usort($results,"DESC");

Solution 5

You can also simply reverse the array once it has been sorted.

Starting the same way you did:

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

and then reversing the results like this:

$myArray = array_reverse($myArray);
Share:
48,811

Related videos on Youtube

000
Author by

000

Updated on March 27, 2021

Comments

  • 000
    000 about 3 years

    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.?

    • Admin
      Admin about 11 years
      By swapping "a" and "b". Something else is wrong here.
    • 000
      000 about 11 years
      that something i am unable to find..
    • Admin
      Admin about 11 years
      maybe some of the elements are stored as strings. Try casting to some numeric type.
  • Barmar
    Barmar about 11 years
    PHP needs a signum() function. BASIC had this function over 40 years ago.