Question

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
    )
)
Was it helpful?

Solution

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'];

OTHER TIPS

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)

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top