PHP 提供超過 10 種陣列排序函數,最常用的三把鑰匙是:**sort() 值排序**、**usort() 自訂值排序**、**uksort() 自訂鍵名排序**。本文詳細拆解語法、比較函數撰寫規則、穩定性變化、陣列鍵值保留差異,並給出實戰範例與避坑指南。
SORT_REGULAR、SORT_NUMERIC、SORT_STRING、SORT_LOCALE_STRING、SORT_NATURAL、SORT_FLAG_CASE。bool。$fruits = ["lemon","orange","banana","apple"];
sort($fruits); // ["apple","banana","lemon","orange"]
// 原鍵名 0,1,2,3 重設為 0,1,2,3
cmp(mixed $a, mixed $b): int,回傳 <0、0、>0 分別代表 $a < $b、$a == $b、$a > $b。$data = [3,2,5,6,1];
usort($data, function($a,$b) {
return $a <=> $b; // PHP 7+ 太空船運算子,簡潔明瞭
});
// $data = [1,2,3,5,6] (索引重設為 0..4)
$users = [
['name'=>'Alice', 'age'=>25, 'score'=>90],
['name'=>'Bob', 'age'=>20, 'score'=>95],
['name'=>'Cindy', 'age'=>25, 'score'=>85],
];
usort($users, function($a,$b) {
// 年齡升序、分數降序
return [$a['age'], -$a['score']] <=> [$b['age'], -$b['score']];
});
/* 結果:
Bob (20,95)
Cindy (25,85)
Alice (25,90)
*/
$data = [4=>'four', 3=>'three', 20=>'twenty', 10=>'ten'];
uksort($data, function($a,$b) {
return $a <=> $b; // 數值鍵名升序
});
/* 結果保留鍵名:
[3=>'three', 4=>'four', 10=>'ten', 20=>'twenty']
*/
| 需求 | 函數 | 鍵名處理 | 比較邏輯 | 穩定性 |
|---|---|---|---|---|
| 單純值升序/降序 | sort / rsort | 重設索引 | 內建 | 不穩定 |
| 關聯陣列值排序 | asort / arsort | 保留鍵名 | 內建 | 不穩定 |
| 自訂值排序邏輯 | usort | 重設索引 | 回呼函數 | 不穩定 |
| 關聯陣列自訂值排序 | uasort | 保留鍵名 | 回呼函數 | 不穩定 |
| 自訂鍵名排序邏輯 | uksort | 保留鍵名 | 回呼函數 | 不穩定 |
| 自然排序(人類直覺) | natsort / natcasesort | 保留鍵名 | 自然順序 | 不穩定 |
true/false 或 null 會導致不可預期行為。<=>:PHP 7+ 首選,自動處理數值/字串比較,程式碼極簡潔。uasort($arr, fn($a,$b) => $a<=>$b) 搭配 array_values() 重建索引,或自行實作合併排序。array_column() + array_multisort() 非回呼方式,速度更快。// 多維陣列依 age 排序(非回呼,極快)
$ages = array_column($users, 'age');
array_multisort($ages, SORT_ASC, $users);
掌握 sort/usort/uksort 三大核心與衍生函數,即能應對 99% 陣列排序場景,寫出高效、可讀、正確的排序邏輯。