首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 二維陣列多欄位排序:array_multisort 實戰範例與進階技巧

     編輯:PHP 相關知識

    核心函數:array_multisort()

    array_multisort() 可同時對多個陣列或多維陣列進行排序,支援混合升序/降序旗標(SORT_ASC/SORT_DESC),是處理二維陣列排序的標準工具。

    完整可執行範例

    <?php
    /**
     * 二維陣列多鍵值排序示範
     * 先依 volume 降序,再依 edition 升序
     */
    $data = [
        ['volume' => 67, 'edition' => 2],
        ['volume' => 86, 'edition' => 1],
        ['volume' => 85, 'edition' => 6],
        ['volume' => 98, 'edition' => 2],
        ['volume' => 86, 'edition' => 6],
        ['volume' => 67, 'edition' => 7],
    ];
    
    // 1. 提取排序欄位至獨立陣列(保持鍵名對應)
    $volume  = array_column($data, 'volume');
    $edition = array_column($data, 'edition');
    
    // 2. 執行多重排序
    // 參數順序:排序陣列1, 旗標1, 排序陣列2, 旗標2, ..., 目標陣列
    array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
    
    print_r($data);
    /*
    輸出結果:
    Array
    (
        [0] => Array ( [volume] => 98 [edition] => 2 )
        [1] => Array ( [volume] => 86 [edition] => 1 )
        [2] => Array ( [volume] => 86 [edition] => 6 )
        [3] => Array ( [volume] => 85 [edition] => 6 )
        [4] => Array ( [volume] => 67 [edition] => 2 )
        [5] => Array ( [volume] => 67 [edition] => 7 )
    )
    */
    ?>

    進階用法與變體

    1. 保留原始鍵名關聯(關聯式陣列)

    $data = [
        'a' => ['volume' => 67, 'edition' => 2],
        'b' => ['volume' => 86, 'edition' => 1],
    ];
    // array_column 會重置數字鍵,需手動提取保持字串鍵
    $volume = [];
    foreach ($data as $k => $row) $volume[$k] = $row['volume'];
    array_multisort($volume, SORT_DESC, $data); // $data 鍵名保持不變

    2. 動態排序欄位與方向

    function multisort_by_fields(array &$array, array $specs) {
        // $specs = [['field'=>'volume', 'order'=>SORT_DESC], ['field'=>'edition', 'order'=>SORT_ASC]]
        $args = [];
        foreach ($specs as $spec) {
            $col = array_column($array, $spec['field']);
            $args[] = $col;
            $args[] = $spec['order'];
        }
        $args[] = &$array; // 參考傳遞目標陣列
        array_multisort(...$args);
    }
    
    // 使用
    multisort_by_fields($data, [
        ['field' => 'volume', 'order' => SORT_DESC],
        ['field' => 'edition', 'order' => SORT_ASC],
    ]);

    3. PHP 7.4+ 箭頭函數簡寫 (配合 usort)

    // 單欄位排序更直觀
    usort($data, fn($a, $b) => $b['volume'] <=> $a['volume']);
    
    // 多欄位需手動比較
    usort($data, function($a, $b) {
        return [$b['volume'], $a['edition']] <=> [$a['volume'], $b['edition']];
    });

    效能與選擇建議

    方法適用場景效能記憶體
    array_multisort多欄位、大量資料、需保持索引快 (C 內核)需額外提取欄位陣列
    usort + 空船運算子邏輯複雜、物件排序、PHP 7+中 (使用者函數呼叫開銷)原地排序
    uasort需保留關聯鍵名中原地排序

    常見陷阱提醒

    • 旗標順序固定:必須是 陣列, 旗標, 陣列, 旗標..., 目標陣列,旗標不可省略。
    • 大小寫敏感:字串比較預設區分大小寫,需統一 strtolower 或使用 SORT_FLAG_CASE | SORT_STRING。
    • 混合型別:數字與字串混排會觸發型別轉換,建議預先正規化資料型別。

    掌握 array_multisort 並搭配 array_column,即可優雅處理各類二維陣列排序需求。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved