| 函數 | 排序依據 | 順序 | 保留鍵名 | 返回值 | 典型場景 |
|---|---|---|---|---|---|
sort() | 值 | 升序 | ❌ 重建 0..n 索引 | bool | 純數值列表、不關心鍵名 |
rsort() | 值 | 降序 | ❌ | bool | 同上,需倒序 |
asort() | 值 | 升序 | ✅ | bool | 關聯數組按值排序,保持鍵值對應 |
arsort() | 值 | 降序 | ✅ | bool | 同上,倒序 |
ksort() | 鍵名 | 升序 | ✅ | bool | 按鍵名字母/數字排序(如配置項) |
krsort() | 鍵名 | 降序 | ✅ | bool | 同上,倒序 |
usort() | 值(自定義) | 自定 | ❌ | bool | 複雜值比較(對象、多維、自然序) |
uasort() | 值(自定義) | 自定 | ✅ | bool | 關聯數組複雜排序 |
uksort() | 鍵名(自定義) | 自定 | ✅ | bool | 鍵名自定義排序(如版本號鍵) |
natsort() | 值(自然序) | 升序 | ✅ | bool | 含數字字符串:img2.png < img10.png |
natcasesort() | 值(自然序、不分大小寫) | 升序 | ✅ | bool | 同上,忽略大小寫 |
<?php
$data = ['a' => 5, 0 => 2, 'b' => 8, 1 => 1];
echo "原始: "; print_r($data);
// sort() - 不保留鍵名
$arr = $data;
sort($arr);
echo "sort: "; print_r($arr); // [0=>1, 1=>2, 2=>5, 3=>8]
// asort() - 保留鍵名
$arr = $data;
asort($arr);
echo "asort: "; print_r($arr); // [1=>1, 0=>2, 'a'=>5, 'b'=>8]
// ksort() - 按鍵名
$arr = $data;
ksort($arr);
echo "ksort: "; print_r($arr); // [0=>2, 1=>1, 'a'=>5, 'b'=>8] (數字鍵在前)
?>
function cmp(mixed $a, mixed $b): int
{
// 返回:負數($a<$b)、0($a==$b)、正數($a>$b)
// PHP 7+ 推薦使用太空船操作符 <=>
return $a <=> $b; // 升序
// return $b <=> $a; // 降序
}
$arr = [3, 1, 4, 1, 5, 9];
usort($arr, fn($a, $b) => $b <=> $a); // 降序
// [9, 5, 4, 3, 1, 1]
$scores = ['張三' => 85, '李四' => 92, '王五' => 85, '趙六' => 78];
// 分數降序,同分按姓名升序
uasort($scores, function($a, $b) {
return $b <=> $a ?: strcmp($a, $b); // 注意:這裡 $a/$b 是值,無法直接獲取鍵名
});
// 實際需同時比較鍵名時,建議用 uksort 或先轉為 [['name'=>..., 'score'=>...]] 結構
$versions = [
'v1.2.10' => '...',
'v1.2.9' => '...',
'v1.10.1' => '...',
'v1.0.0' => '...',
];
uksort($versions, function($a, $b) {
// 移除 'v' 前綴,按點分割,逐段數值比較
$a = array_map('intval', explode('.', ltrim($a, 'v')));
$b = array_map('intval', explode('.', ltrim($b, 'v')));
return $a <=> $b;
});
/* 結果順序:
v1.0.0
v1.2.9
v1.2.10
v1.10.1
*/
$users = [
['name' => 'A', 'age' => 25],
['name' => 'B', 'age' => 20],
['name' => 'C', 'age' => 30],
];
// PHP 5.5+ array_column + array_multisort (高效、推薦)
array_multisort(array_column($users, 'age'), SORT_ASC, $users);
/* 或 PHP 7.4+ 箭頭函數 usort */
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 保留原鍵名需用 uasort
$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'] ✅
$arr = ['Apple', 'banana', 'Cherry'];
sort($arr, SORT_FLAG_CASE | SORT_STRING);
// ['Apple', 'banana', 'Cherry'] (ASCII 碼順序)
natcasesort($arr);
// ['Apple', 'banana', 'Cherry'] (自然序+忽略大小寫)
bool 而非新數組$new = sort($arr); → $new = true$copy = $arr; sort($copy);數組大小: 10,000 元素 sort() : ~1.2 ms asort() : ~1.5 ms usort(箭頭函數) : ~3.8 ms usort(閉包) : ~5.2 ms uksort(複雜比較) : ~8.5 ms
選型口訣:值排序不留鍵→
sort/rsort;值排序留鍵→asort/arsort;鍵排序→ksort/krsort;邏輯複雜→usort/uasort/uksort;含數字字符串→natsort;多維按列→array_multisort。