Reputation: 1356
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
)
)
Upvotes: 1
Views: 2050
Reputation: 212412
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;
}
Upvotes: -1
Reputation: 7005
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)
Upvotes: 4
Reputation: 6113
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'];
Upvotes: 4