没有使用PHP正确排序的多维数组

没有使用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)