没有使用PHP正确排序的多维数组
问题描述:
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
)
)
我无法得到这个。 为什么这不起作用? p>
$ list = array(array('id'=> 123),array('id'=> 10),array(' id'=> 1000));
$ this-> OrderListById($ list);
返回$ list;
公共函数OrderListById($ list){
usort($ list,function($ a,$ b){return $ a ['id'] - $ b ['id'];});
}
code> pre>
返回 p>
array(
(int)0 => array(
'id'=>(int)123
),
(int)1 => 数组(
'id'=>(int)10
),
(int)2 =>数组(
'id'=>(int)1000
)
)
pre>
我希望更有序的东西:D p>
array(
(int)0 => array (
'id'=>(int)10
),
(int)1 =>数组(
'id'=>(int)123
),
(int)2 =>数组(
'id'=>(int)1000
)
)
code> pre>
div>
答
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'];
答
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;
}
答
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)