1

I can't get this. Why doesn' this work?

    $list = array(array('id' => 123), array('id' => 10), array('id' => 1000));
    $this->OrderListById($list);
    return $list;

    public function OrderListById($list){
        usort($list, function($a, $b) {return $a['id'] - $b['id'];});
    }

This returns

array(
    (int) 0 => array(
        'id' => (int) 123
    ),
    (int) 1 => array(
        'id' => (int) 10
    ),
    (int) 2 => array(
        'id' => (int) 1000
    )
)

And i was hoping something like more ordered :D

array(
    (int) 0 => array(
        'id' => (int) 10
    ),
    (int) 1 => array(
        'id' => (int) 123
    ),
    (int) 2 => array(
        'id' => (int) 1000
    )
)
makallio85
  • 1,366
  • 2
  • 14
  • 29
  • possible duplicate of [Sort Multi-dimensional Array by Value](http://stackoverflow.com/questions/2699086/sort-multi-dimensional-array-by-value) – Mr. Alien Jan 13 '14 at 14:52

3 Answers3

4

The $list parameter in the OrderListById must be a reference:

public function OrderListById(array &$list)
{
    usort($list, function($a, $b) {
        return $a['id'] - $b['id'];
    });
}

Should work.

As a precaution you could typecast values as you compare them, just in case they are not integers, however, that's something you should check before you sort the array:

return (int) $a['id'] - (int) $b['id'];
Andris
  • 5,853
  • 3
  • 28
  • 34
4

return $a['id'] - $b['id'];

1000-123 is more than 123-10.

This should be more like the example, where you do a comparison, not subtraction.

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

In one line that would be:

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

(not tested, might be a typo, but that's the jist of it)

Jessica
  • 7,075
  • 28
  • 39
-1

Either pass by Reference:

public function OrderListById(&$list){
    usort($list, function($a, $b) {return $a['id'] - $b['id'];});
}

or return the sorted list

public function OrderListById($list){
    usort($list, function($a, $b) {return $a['id'] - $b['id'];});
    return $list;
}
Mark Baker
  • 209,507
  • 32
  • 346
  • 385