PHP 提供豐富的陣列排序函式,依「依值/鍵排序」、「升冪/降冪」、「是否保留鍵名關聯」分類。本文整理所有常用函式,並示範多維陣列與自訂比較函式(usort)的進階用法。
| 函式 | 排序依據 | 順序 | 保留鍵名關聯 |
|---|---|---|---|
| sort | 值 | 升冪 | 否(重建 0..n) |
| rsort | 值 | 降冪 | 否 |
| asort | 值 | 升冪 | 是 |
| arsort | 值 | 降冪 | 是 |
| ksort | 鍵 | 升冪 | 是 |
| krsort | 鍵 | 降冪 | 是 |
$lang = ['c'=>'php', 'd'=>'asp', 'a'=>'jsp', 'b'=>'java'];
krsort($lang);
foreach ($lang as $k=>$v) echo "$k = $v
";
// 輸出:d=asp, c=php, b=java, a=jsp
$ar1 = ["10", 100, 100, "a"];
$ar2 = [1, 3, "2", 1];
array_multisort($ar1, $ar2);
// $ar1: ["10", "a", 100, 100]
// $ar2: [1, 1, "2", 3] // 對應 $ar1 中相同值的項目順序
$data = [
['name'=>'A', 'score'=>80],
['name'=>'B', 'score'=>90],
['name'=>'C', 'score'=>70]
];
// 依 score 降冪
array_multisort(array_column($data, 'score'), SORT_DESC, $data);
print_r($data);
當排序邏輯複雜(如多欄位、物件屬性),使用 usort:
$arr = [
['score'=>60], ['score'=>70], ['score'=>80],
['score'=>90], ['score'=>20], ['score'=>10],
['score'=>50], ['score'=>30]
];
usort($arr, function($a, $b) {
return $a['score'] <=> $b['score']; // PHP 7+ 太空船運算子
// 舊版:return $a['score'] - $b['score'];
});
// 結果:10,20,30,50,60,70,80,90(升冪)
usort($arr, function($a, $b) {
return $b['score'] <=> $a['score'];
});
usort($users, function($a, $b) {
if ($a['age'] !== $b['age']) return $a['age'] <=> $b['age'];
return $b['score'] <=> $a['score'];
});
usort 需呼叫 PHP 回呼函式,資料量超過萬筆時較慢,可考慮先用 array_multisort 配合 array_column。sort/rsort 可節省記憶體。