首页 >后端开发 >php教程 >如何按列(包括日期和自定义标准)对多维 PHP 数组进行高效排序?

如何按列(包括日期和自定义标准)对多维 PHP 数组进行高效排序?

Susan Sarandon
Susan Sarandon原创
2024-12-20 16:34:09916浏览

How to Efficiently Sort a Multidimensional PHP Array by Column, Including Dates and Custom Criteria?

在 PHP 中对多维数组进行排序:一种灵活的方法

查询

如何根据指定列高效地排列多维数组,特别是当数据包含日期并且您需要自定义排序标准时?

答案

引入 PHP 5.3 的增强解决方案

该解决方案具有以下几个优点:

  • 可重用:定义将列排序为变量。
  • 灵活:处理多个排序列和辅助决胜局。
  • 可逆:按每列的升序或降序排序。
  • 可扩展:利用复杂的自定义投影或不可比较的数据。
  • 关联:使用 usort 或 uasort 与关联数组兼容。

代码

function make_comparer() {
    // Normalize criteria
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion) ? array_pad($criterion, 3, null) : array($criterion, SORT_ASC, null);
    }

    return function ($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
            // Comparison details
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

            // Project and compare values
            $lhs = $projection ? call_user_func($projection, $first[$column]) : $first[$column];
            $rhs = $projection ? call_user_func($projection, $second[$column]) : $second[$column];

            // Determine the comparison result
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            } elseif ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        // Tiebreakers exhausted
        return 0;
    };
}

用法

考虑示例data:

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

基本排序:

  • 按“name”列排序: usort($data, make_comparer('name'));

多个排序列:

  • 按“number”列排序,然后按零索引列排序:usort($data, make_comparer('number', 0));

高级功能:

  • 反向排序:按“name”列降序排序:usort($data, make_comparer(['name', SORT_DESC]));
  • 自定义投影: 将生日日期投影到时间戳以进行排序: usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

复杂用例:

  • 按“数字”列降序排序,然后是预计的“生日”列升序:

    usort($data, make_comparer(
      ['number', SORT_DESC],
      ['birthday', SORT_ASC, 'date_create']
    ));

以上是如何按列(包括日期和自定义标准)对多维 PHP 数组进行高效排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn