PHP 提供了豐富的陣列排序函數,依據「是否保留鍵值關聯」、「索引類型」、「排序依據(鍵/值)」可分為數個家族。本文系統梳理 sort、asort、ksort 等核心函數用法,並闡述多維陣列排序的核心難點與解決路徑。
<?php
$arr = array('100', '200', '300'); // 索引 0,1,2
$nums = range(1, 10); // 1..10
$nums = range(1, 10, 2); // 1,3,5,7,9 步長 2
?>
| 函數 | 排序依據 | 保留鍵值關聯 | 順序 | 備註 |
|---|---|---|---|---|
| sort() | 值 | 否(重建 0..n 索引) | 升序 | 區分大小寫,大寫在前 |
| rsort() | 值 | 否 | 降序 | sort 反向 |
| asort() | 值 | 是 | 升序 | 關聯陣列首選 |
| arsort() | 值 | 是 | 降序 | asort 反向 |
| ksort() | 鍵 | 是 | 升序 | 按鍵名排序 |
| krsort() | 鍵 | 是 | 降序 | ksort 反向 |
<?php
$price = array('蘋果'=>5, '香蕉'=>6, '荔枝'=>7);
ksort($price); // 按鍵名:荔枝, 蘋果, 香蕉 (Unicode 碼位順序)
asort($price); // 按值:蘋果 5, 香蕉 6, 荔枝 7
?>
第二參數旗標:SORT_NUMERIC(數值比較)、SORT_STRING(字串比較)、SORT_REGULAR(預設)。
例:sort($arr, SORT_NUMERIC) 確保 "12" > "2"。
難點:PHP 不知道如何比較兩個陣列(陣列元素本身是陣列),需提供比較邏輯。
解法三選一:
<?php
$data = array(
array('name'=>'A', 'age'=>20),
array('name'=>'B', 'age'=>18),
array('name'=>'C', 'age'=>25)
);
usort($data, function($a, $b) {
return $a['age'] - $b['age']; // 年齡升序
});
// PHP 7+ 可用太空船運算子:return $a['age'] <=> $b['age'];
?>
<?php
$ages = array_column($data, 'age');
array_multisort($ages, SORT_ASC, $data);
?>
sort() / rsort()asort() / arsort()ksort() / krsort()array_multisort 或 usortusort + 匿名函數sort() 會重置數字索引,關聯鍵名會丟失。SORT_NUMERIC。strcasecmp 搭配 usort。bool,排序結果直接修改原陣列,勿寫成 $arr = sort($arr)(會變成 true)。