array_multisort() 是 PHP 排序利器:可同時排序多個陣列,或依多維陣列的某一/多欄位排序(類似 SQL ORDER BY col1 ASC, col2 DESC)。本文系統整理語法、參數、常見陷阱與實戰範例。
<?php
array_multisort(
array &$array1, // 必須:主要排序陣列
int $sort_order = SORT_ASC, // 可選:SORT_ASC / SORT_DESC
int $sort_type = SORT_REGULAR, // 可選:排序型別
array &$array2, ... // 可選:次要排序陣列(同步排序)
): bool
?>
SORT_ASC:升序(預設)SORT_DESC:降序SORT_REGULAR:預設,ASCII 碼比較(不轉型)SORT_NUMERIC:數值比較SORT_STRING:字串比較SORT_LOCALE_STRING:依 setlocale() 當前地區設定比較SORT_NATURAL:自然排序(如 natsort(),img2.png < img10.png)SORT_FLAG_CASE:配合 SORT_STRING|SORT_NATURAL 忽略大小寫true/false,原陣列被修改(引用傳遞)。<?php
$data = [
['name' => 'Alice', 'age' => 25, 'score' => 88],
['name' => 'Bob', 'age' => 25, 'score' => 92],
['name' => 'Charlie','age' => 22, 'score' => 90],
];
// 先按 age 升序,age 同則按 score 降序
$age = array_column($data, 'age');
$score = array_column($data, 'score');
array_multisort($age, SORT_ASC, SORT_NUMERIC,
$score, SORT_DESC, SORT_NUMERIC,
$data); // $data 同步重排
print_r($data);
/* 結果:
Charlie 22 90
Bob 25 92
Alice 25 88
*/
?>
<?php
$arr = ['Alpha', 'atomic', 'Beta', 'bank'];
$lower = array_map('strtolower', $arr);
array_multisort($lower, SORT_ASC, SORT_STRING | SORT_FLAG_CASE, $arr);
// 或 PHP 5.4+ 直接:
// array_multisort($arr, SORT_ASC, SORT_STRING | SORT_FLAG_CASE);
print_r($arr); // Alpha, atomic, bank, Beta
?>
<?php $files = ['img1.png', 'img10.png', 'img2.png', 'img20.png']; array_multisort($files, SORT_ASC, SORT_NATURAL); print_r($files); // img1, img2, img10, img20 ?>
<?php $ids = [3, 1, 2]; $names = ['C', 'A', 'B']; array_multisort($ids, SORT_ASC, $names); // $ids => [1,2,3], $names => ['A','B','C'] ?>
array_multisort(array_column($data,'age'), ...) ❌ → 先存變數 ✅。uksort() 或 uasort()。'10' 用 SORT_STRING 會排在 '2' 前面,必須用 SORT_NUMERIC。SORT_LOCALE_STRING 需先 setlocale(LC_COLLATE, 'zh_TW.utf8'),否則退回預設。| 函數 | 適用場景 | 特點 |
|---|---|---|
| array_multisort | 多欄位、多陣列同步排序 | 效能最好(C 實現),語法稍繁 |
| usort/uasort/uksort | 複雜自定義比較邏輯 | 彈性最大,需寫 callback,較慢 |
| natsort/natcasesort | 自然排序(單陣列) | 簡潔,保留鍵名 |
array_multisort() 是處理「類 SQL 多欄位排序」的標準工具。掌握 SORT_NUMERIC、SORT_NATURAL、SORT_FLAG_CASE 組合技,能解決 90% 的陣列排序需求。