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

时间:2014-01-13 14:50:24

标签: php usort

我无法得到这个。为什么这不起作用?

    $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'];});
    }

返回

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

我希望更有序的东西:D

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

3 个答案:

答案 0 :(得分:4)

$list中的OrderListById参数必须是参考:

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

应该工作。

作为预防措施,您可以在比较它们时对类型进行类型转换,以防它们不是整数,但是,在对数组进行排序之前应该检查一下:

return (int) $a['id'] - (int) $b['id'];

答案 1 :(得分:3)

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

1000-123超过123-10。

这应该更像是一个例子,你进行比较而不是减法。

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

在一行中:

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

(未经测试,可能是一个错字,但这是它的主旨)

答案 2 :(得分:-1)

通过参考:

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

或返回已排序的列表

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