PHP 提供豐富的數組排序函數,按「值/鍵」、「順序/逆序」、「保持/重置鍵」、「用戶自定義」等維度分類。本文系統整理核心函數用法、差異對比與最佳實踐。
| 函數 | 依據 | 順序 | 鍵名 | 用戶自定義 |
|---|---|---|---|---|
sort() | 值 | 升序 | 重置(0..n) | 否 |
rsort() | 值 | 降序 | 重置 | 否 |
asort() | 值 | 升序 | 保持關聯 | 否 |
arsort() | 值 | 降序 | 保持關聯 | 否 |
ksort() | 鍵 | 升序 | 保持關聯 | 否 |
krsort() | 鍵 | 降序 | 保持關聯 | 否 |
usort() | 值 | 自定義 | 重置 | 是 |
uasort() | 值 | 自定義 | 保持關聯 | 是 |
uksort() | 鍵 | 自定義 | 保持關聯 | 是 |
array_multisort() | 多數組/多維 | 混合 | 視情況 | 否 |
natsort() | 值(自然序) | 升序 | 保持關聯 | 否 |
natcasesort() | 值(自然序不區分大小寫) | 升序 | 保持關聯 | 否 |
$fruits = ["lemon", "orange", "banana", "apple"];
sort($fruits); // ["apple", "banana", "lemon", "orange"]
// 鍵名重置為 0,1,2,3
$scores = ["Tom" => 85, "Jerry" => 92, "Bob" => 78];
asort($scores); // ["Bob"=>78, "Tom"=>85, "Jerry"=>92] 鍵值關聯保持
$data = [3, 2, 5, 6, 1];
// 降序 (大->小)
usort($data, function($a, $b) {
if ($a == $b) return 0;
return $a > $b ? -1 : 1; // 返回負值表示 $a 排前面
});
// 結果: [6, 5, 3, 2, 1]
// 等價寫法 (PHP 7+ 太空船運算符)
usort($data, fn($a, $b) => $b <=> $a);
比較函數規範:返回 <0 ($a<$b), 0 ($a=$b), >0 ($a>$b)。
$users = [
['name' => 'Tom', 'age' => 20, 'score' => 85],
['name' => 'Ann', 'age' => 18, 'score' => 92],
['name' => 'Jack', 'age' => 22, 'score' => 85],
];
// 方法一: array_multisort (提取列排序)
$ages = array_column($users, 'age');
$scores = array_column($users, 'score');
array_multisort($ages, SORT_ASC, $scores, SORT_DESC, $users);
// 年齡升序,年齡相同則分數降序
// 方法二: usort 靈活控制
usort($users, function($a, $b) {
if ($a['age'] != $b['age']) return $a['age'] <=> $b['age'];
return $b['score'] <=> $a['score']; // 分數降序
});
$files = ['img1.png', 'img10.png', 'img2.png', 'img20.png'];
sort($files); // ['img1.png', 'img10.png', 'img2.png', 'img20.png'] (字典序)
natsort($files); // ['img1.png', 'img2.png', 'img10.png', 'img20.png'] (自然序)
$data = [3 => 'c', 1 => 'a', 2 => 'b'];
asort($data); // [1=>'a', 2=>'b', 3=>'c'] 鍵名不變
class User {
public $name, $age;
function __construct($n, $a) { $this->name=$n; $this->age=$a; }
}
$users = [new User('Tom',20), new User('Ann',18)];
usort($users, fn($a,$b) => $a->age <=> $b->age);
SORT_REGULAR:正常比較 (默認)SORT_NUMERIC:數值比較SORT_STRING:字符串比較SORT_LOCALE_STRING:按當前 locale 比較SORT_NATURAL:自然排序SORT_FLAG_CASE:不區分大小寫 (配合 STRING/NATURAL)bool 表示成功usort 回調開銷大,優先用內置 sort/asort/ksortarray_multisort 會複製數組,超大數組注意內存
// 1. 箭頭函數簡潔語法 (PHP 7.4+)
usort($arr, fn($a, $b) => $a['priority'] <=> $b['priority']);
// 2. 多字段排序輔助函數
function multiSort(array &$array, array $fields) {
usort($array, function($a, $b) use ($fields) {
foreach ($fields as $field => $dir) {
$cmp = $a[$field] <=> $b[$field];
if ($cmp !== 0) return $dir === SORT_DESC ? -$cmp : $cmp;
}
return 0;
});
}
multiSort($users, ['age' => SORT_ASC, 'score' => SORT_DESC]);
掌握排序函數族,能優雅高效處理各類數據排序需求。