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);
array_multisort($a, $b, SORT_DESC) 會將 SORT_DESC 套用到 $b,而非 $a。'10' 在 SORT_STRING 下小於 '2',務必显式指定 SORT_NUMERIC。strtolower 或用 uksort 自訂比較。sort()/rsort() 更輕量。array_multisort() 是 PHP 處理「多欄位、混合型別、混合升降序」排序的瑞士刀。掌握「旗標緊跟陣列」與「明確指定型別旗標」兩大原則,即能駕馭絕大多數商業邏輯排序需求。