【问题标题】:Mutlidimensional array not sorting with PHP usort correctly多维数组未正确使用 PHP usort 排序
【发布时间】:2014-01-13 14:50:23
【问题描述】:

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

    $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
    )
)

【问题讨论】:

标签: php usort


【解决方案1】:

OrderListById 中的$list 参数必须是引用:

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

应该可以。

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

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

【讨论】:

  • 哈!它总是很简单,不是吗。很高兴为您提供帮助!
【解决方案2】:

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)); });

(未测试,可能是错字,但就是这样)

【讨论】:

  • 工作解决方案也是如此。实现比我想要的更混乱:D
【解决方案3】:

通过引用传递:

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;
}

【讨论】:

  • 不是投反对票的人,但您似乎匆忙按下了回答按钮
  • 哎呀,我实际上会因为仓促回答而获得多少反对票(即使现在答案的格式很干净)
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 2023-03-31
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多