首頁 > 後端開發 > php教程 > 如何按列(包括日期和自訂標準)對多維 PHP 陣列進行高效排序?

如何按列(包括日期和自訂標準)對多維 PHP 陣列進行高效排序?

Susan Sarandon
發布: 2024-12-20 16:34:09
原創
879 人瀏覽過

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 = 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'),
);
登入後複製
用法

考慮示例data:

  • 基本排序:

按「name」欄位排序: usort($data, make_comparer('name'));

  • 多個排序列:

依「number」欄位排序,然後依零索引列排序:usort($data, make_comparer('number', 0));

  • 進階功能:
  • 反向排序:依「名稱」列降序排序: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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板