array_multisort() 是 PHP 內建最強大的排序函數,可同時對多個陣列或多維陣列的特定欄位進行複合排序,邏輯類似 SQL 的 ORDER BY col1 ASC, col2 DESC。本文詳細解析參數結構、排序旗標與六大實戰範例。
bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] )
SORT_ASC(升序)、SORT_DESC(降序)SORT_REGULAR(預設)、SORT_NUMERIC、SORT_STRING、SORT_LOCALE_STRING、SORT_NATURAL、SORT_FLAG_CASE<?php
$ar1 = array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);
// $ar1: "10", "a", 100, 100
// $ar2: 1, 1, "2", 3 (對應 $ar1 中 100 的原始順序)
?>
<?php
$ar = array(
array("10", 100, 100, "a"),
array(1, 3, "2", 1)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING, // 第 0 欄字串升序
$ar[1], SORT_NUMERIC, SORT_DESC); // 第 1 欄數值降序
?>
假設從資料庫取得 $data(每筆為關聯陣列),需按 volume DESC, edition ASC 排序:
<?php
$data = array(
array('volume'=>67, 'edition'=>2),
array('volume'=>86, 'edition'=>1),
array('volume'=>85, 'edition'=>6),
array('volume'=>98, 'edition'=>2),
array('volume'=>86, 'edition'=>6),
array('volume'=>67, 'edition'=>7)
);
// 1. 提取排序欄位陣列
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
// 2. 多鍵排序,最後放入 $data 以同步調整順序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
// 結果:98|2, 86|1, 86|6, 85|6, 67|2, 67|7
?>
<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lower = array_map('strtolower', $array);
array_multisort($array_lower, SORT_ASC, SORT_STRING, $array);
// 結果:Alpha, atomic, bank, Beta
?>
<?php
$grade = array(
"score" => array(70, 95, 70.0, 60, "70"),
"name" => array("Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Liu Qi")
);
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,
$grade["name"], SORT_STRING, SORT_ASC);
// 李四 95 第1,趙六 60 第5,70分三人按姓名:Liu Qi, Wang Wu, Zhang San
?>
雖然 array_multisort 也能處理,但現代 PHP 建議對物件陣列使用 usort + 太空船運算子(<=>)或匿名函數,可讀性更高。
ORDER BY 前置排序。SORT_NUMERIC/SORT_STRING。