【问题标题】:How to sort php array by multiple fields using usort [duplicate]如何使用 usort 按多个字段对 php 数组进行排序 [重复]
【发布时间】:2014-07-16 05:57:45
【问题描述】:
usort($childs, function($a, $b) {
    return $a['parent_id'] - $b['parent_id'];
});

这里我按 1 个字段排序,如何添加更多字段进行排序?,就像是 Mysql 中的 ORDER BY field1, field2, field3 一样

【问题讨论】:

标签: php mysql php-5.4


【解决方案1】:
usort($childs, function($a, $b) {
    if ($a['field1'] == $b['field1']) {
        if ($a['field2'] == $b['field2']) {
            return $a['field3'] < $b['field3'] ? -1 : 1;
        } else {
            return 0;
        }
        return $a['field2'] < $b['field2'] ? -1 : 1;
    }
    return $a['field1'] < $b['field1'] ? -1 : 1;
});

编辑

更通用的解决方案(未经测试)

$sorts = array('field1' => 'asc', 'field2' => 'asc', 'field3' => 'asc');

usort($childs, function($a, $b) use (array $sorts = array()) {
    foreach($sorts as $field => $direction) {
        if ($a[$field] != $b[$field]) {
            if ($direction == 'asc') {
                return $a[$field] < $b[$field] ? -1 : 1;
            }
            return $a[$field] < $b[$field] ? 1 : -1;
        }
    }
    return 0;
});

【讨论】:

  • if ($a[1] != $b[1]) return ...; if ($a[2] != $b[2]) return ... 会不会更具可读性...? :)
  • 为什么要附加逻辑而不仅仅是return $a[..] - $b[..];
  • @deceze - 可能只是试图使用 usort() 而不是 array_multisort().... 为 OP 的问题提供一个字面答案。并着眼于通过传递一个数组 ( ['field1' => 'asc', 'field2' => 'asc', 'field3' => 'asc']) 以及通过use... 虽然我不确定我是否有时间现在就努力
  • 尤其是在usort 回调中,我不会使用这种右缩进嵌套if 样式。此外,如果您在比较数字,$a - $b 可以很好地返回 0。对于字符串,我会使用 strcmp,它可以实现相同的效果。另见stackoverflow.com/a/22829326/476
  • 是的,strcmp 绝对更适合比较字符串,当你知道它们是字符串时
猜你喜欢
  • 2018-02-01
  • 2012-03-04
  • 1970-01-01
  • 2023-03-31
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多