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

PHP array_multisort() 多維陣列排序完全指南:混合升降序與型別比較

     編輯:PHP 相關知識

函式簽名與核心概念

bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] )

多陣列同步排序: 以第一陣列為主鍵排序,後續陣列隨著第一陣列的順序同步調整,類似 SQL 的 ORDER BY col1, col2。

排序旗標完整對照表

分類常數說明
順序旗標 SORT_ASC 升序(預設)
SORT_DESC 降序
型別旗標 SORT_REGULAR 一般比較(預設,不轉型)
SORT_NUMERIC 數值比較
SORT_STRING 字串比較

規則: 每個陣列後最多接一個順序旗標 + 一個型別旗標,順序不拘。

實戰範例:員工薪資表多欄位排序

<?php
$name  = ['小陳', '小林', '小王', '小李'];
$age   = [25, 28, 25, 30];
$salary= [45000, 52000, 48000, 60000];

// 需求:依 age 升序,age 相同則 salary 降序
array_multisort($age, SORT_ASC, SORT_NUMERIC,
                $salary, SORT_DESC, SORT_NUMERIC,
                $name); // name 同步調整,不指定旗標用預設

print_r([$name, $age, $salary]);
/* 結果:
Array (
    [0] => Array ( [0] => 小陳 [1] => 小王 [2] => 小林 [3] => 小李 )
    [1] => Array ( [0] => 25 [1] => 25 [2] => 28 [3] => 30 )
    [2] => Array ( [0] => 48000 [1] => 45000 [2] => 52000 [3] => 60000 )
)
*/
?>

進階用法:二維關聯陣列排序

配合 array_column() 提取欄位再排序:

<?php
$staff = [
    ['id'=>1, 'name'=>'A', 'dept'=>'IT', 'salary'=>50000],
    ['id'=>2, 'name'=>'B', 'dept'=>'HR', 'salary'=>45000],
    ['id'=>3, 'name'=>'C', 'dept'=>'IT', 'salary'=>55000],
];
// 依 dept 升序(字串),同 dept 依 salary 降序(數值)
$dept  = array_column($staff, 'dept');
$salary= array_column($staff, 'salary');
array_multisort($dept, SORT_ASC, SORT_STRING,
                $salary, SORT_DESC, SORT_NUMERIC,
                $staff);
print_r($staff);

常見坑點與除錯技巧

  1. 旗標位置錯誤: 旗標必須緊跟在對應陣列之後,array_multisort($a, $b, SORT_DESC) 會將 SORT_DESC 套用到 $b,而非 $a。
  2. 型別不一致導致驚喜: 數字字串 '10' 在 SORT_STRING 下小於 '2',務必显式指定 SORT_NUMERIC。
  3. 大小寫敏感: 字串比較區分大小寫,需不區分時請先統一 strtolower 或用 uksort 自訂比較。

效能補充

  • 時間複雜度 O(n log n),底層採用快速排序變體。
  • 記憶體開銷:需額外建立索引陣列,百萬筆資料約佔 8-16 MB。
  • 若僅排序單一陣列,sort()/rsort() 更輕量。

總結

array_multisort() 是 PHP 處理「多欄位、混合型別、混合升降序」排序的瑞士刀。掌握「旗標緊跟陣列」與「明確指定型別旗標」兩大原則,即能駕馭絕大多數商業邏輯排序需求。

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