PHP 提供豐富的陣列排序函式,命名規則其實暗藏玄機。掌握 a (association)、k (key)、r (reverse)、u (user-defined) 四個關鍵字後綴,即可輕鬆記憶 10 種核心排序函式的行為差異。本文系統整理並附上多維陣列排序實戰範例。
| 後綴 | 含義 | 行為 |
|---|---|---|
| a | Association | 依值排序,保持鍵值關聯 |
| k | Key | 依鍵名排序 |
| r | Reverse | 反向(降序) |
| u | User-defined | 使用自訂比較函式 |
組合範例:asort = a(關聯) + sort(升序);krsort = k(鍵名) + r(反向) + sort(排序)。
$fruits = ["lemon", "orange", "banana", "apple"];
sort($fruits); // 升序:apple, banana, lemon, orange
rsort($fruits); // 降序:orange, lemon, banana, apple
$fruits = ["d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple"];
asort($fruits); // 依值升序:c=>apple, b=>banana, d=>lemon, a=>orange
arsort($fruits); // 依值降序:a=>orange, d=>lemon, b=>banana, c=>apple
ksort($fruits); // 依鍵升序:a=>orange, b=>banana, c=>apple, d=>lemon
krsort($fruits); // 依鍵降序:d=>lemon, c=>apple, b=>banana, a=>orange
// usort:依值排序,不保留鍵名
usort($arr, function($a, $b) { return $a <=> $b; }); // PHP 7+ 太空船運算子
// uasort:依值排序,保留鍵名
uasort($arr, function($a, $b) { return $a <=> $b; });
// uksort:依鍵名排序,保留鍵名
uksort($arr, function($a, $b) { return strcasecmp($a, $b); });
array_multisort()$ar = [
["10", 11, 100, 100, "a"],
[1, 2, "2", 3, 1]
];
// 優先按 $ar[0] 字串升序,次按 $ar[1] 數值降序
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
常見需求:商品列表依價格、銷量等欄位排序。封裝通用函式:
/**
* 二維陣列依指定鍵值排序
* @param array $arr 待排序陣列
* @param string $key 排序依據的鍵名
* @param string $order 'asc' 或 'desc'
* @return array
*/
function array_sort(array $arr, string $key, string $order = 'asc'): array
{
$keys = array_column($arr, $key); // PHP 5.5+ 取得單欄陣列
$order === 'asc' ? asort($keys) : arsort($keys);
$result = [];
foreach ($keys as $k => $v) {
$result[$k] = $arr[$k];
}
return $result;
}
// 使用範例
$products = [
['name'=>'手機', 'brand'=>'諾基亞', 'price'=>1050],
['name'=>'筆電', 'brand'=>'Lenovo', 'price'=>4300],
['name'=>'剃鬚刀', 'brand'=>'飛利浦', 'price'=>3100],
];
$sorted = array_sort($products, 'price', 'asc');
// 結果:手機(1050) → 剃鬚刀(3100) → 筆電(4300)
bool 而非新陣列:sort($arr) 而非 $arr = sort($arr)。array_multisort() 接受多組「陣列 + 排序旗標」組合,旗標順序對應前一個陣列參數。$a <=> $b。