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

PHP array_multisort() 多維陣列排序完整指南

     編輯:PHP 綜合知識

函數特性

  • 可一次排序多個陣列,或依某幾個鍵排序多維陣列。
  • 字串鍵名保持,數字鍵重新索引(0,1,2...)。
  • 運作邏輯如 SQL ORDER BY col1 ASC, col2 DESC:第一陣列為主排序鍵,值相同時依第二陣列,以此類推。

排序旗標

類別常數說明
順序SORT_ASC升冪(預設)
SORT_DESC降冪
型別SORT_REGULAR一般比較(預設)
SORT_NUMERIC數值比較
SORT_STRING字串比較

每個陣列後可接 0~2 個旗標(一序一型),僅對該陣列生效。

範例 1:排序多個一維陣列

$num1 = [3,5,4,3];
$num2 = [27,50,44,78];
array_multisort($num1, SORT_ASC, $num2, SORT_DESC);
// $num1 => [3,3,4,5]
// $num2 => [78,27,44,50]  // 對應 $num1 相同值(3)時,按 $num2 降冪

範例 2:多維陣列依特定欄位排序

$arr = [
    ['num1'=>3, 'num2'=>27],
    ['num1'=>5, 'num2'=>50],
    ['num1'=>4, 'num2'=>44],
    ['num1'=>3, 'num2'=>78],
];

// 1. 提取排序鍵陣列
foreach ($arr as $k => $row) {
    $sort1[$k] = $row['num1'];
    $sort2[$k] = $row['num2'];
}

// 2. 最後一個參數放入原陣列(by reference 會被重排)
array_multisort($sort1, SORT_ASC, $sort2, SORT_DESC, $arr);

/* 結果:
Array(
  [0] => Array([num1]=>3 [num2]=>78)
  [1] => Array([num1]=>3 [num2]=>27)
  [2] => Array([num1]=>4 [num2]=>44)
  [3] => Array([num1]=>5 [num2]=>50)
)
*/

通用封裝函式

function array_sort_by_keys(array &$data, array $keys) {
    // $keys = ['num1'=>SORT_ASC, 'num2'=>SORT_DESC]
    $sortArrays = [];
    foreach ($keys as $key => $order) {
        foreach ($data as $k => $row) $sortArrays[$key][$k] = $row[$key];
        $params[] = &$sortArrays[$key];
        $params[] = $order;
    }
    $params[] = &$data;
    call_user_func_array('array_multisort', $params);
}

// 使用
array_sort_by_keys($arr, ['num1'=>SORT_ASC, 'num2'=>SORT_DESC]);

效能與替代方案

  • 資料量 < 10 萬筆:array_multisort 極快(C 實作)。
  • 超大資料:建議在資料庫層 ORDER BY 完成,避免 PHP 記憶體壓力。
  • PHP 7+ 也可用 usort + 太空船運算子 <=> 寫法更直觀:
usort($arr, function($a,$b){
    return [$a['num1'], -$a['num2']] <=> [$b['num1'], -$b['num2']];
});

常見錯誤

  1. 忘記將原陣列以參考傳遞(&$arr)放入參數末尾,導致原陣列不變。
  2. 排序鍵陣列索引與原陣列不對應(必須同鍵名)。
  3. 旗標順序錯誤或重複指定同類旗標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved