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 )
)
*/
?>
$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 鍵名保持不變
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],
]);
// 單欄位排序更直觀
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,即可優雅處理各類二維陣列排序需求。