基本排序:值排序
| 函數 | 順序 | 鍵名保留 | 範例 |
sort() | 升序 | ❌ 重新索引 0..n | [5,8,1,7,2] → [1,2,5,7,8] |
rsort() | 降序 | ❌ 重新索引 | [5,8,1,7,2] → [8,7,5,2,1] |
關鍵字排序:保留鍵值關聯
| 函數 | 依據 | 順序 | 範例 (鍵→值) |
ksort() | Key | 升序 | ['US'=>'US','IN'=>'India','DE'=>'DE'] → DE,ES,IN,US |
krsort() | Key | 降序 | 反向 |
asort() | Value | 升序 | 依值字母序,鍵跟著動 |
arsort() | Value | 降序 | 反向 |
自然語言排序
<?php
$data = ['book-1', 'book-10', 'book-100', 'book-5'];
sort($data); // ['book-1','book-10','book-100','book-5'] 字典序
natsort($data); // ['book-1','book-5','book-10','book-100'] 人類直覺序
// 降序自然排序
$nat = $data; natsort($nat); $nat = array_reverse($nat, true);
// ['book-100','book-10','book-5','book-1']
?>
自定義比較:usort / uasort / uksort
<?php
// 依字串長度排序 (短→長)
$data = ['joe@host.com', 'john.doe@gh.co.uk', 'asmithsonian@us.info', 'jay@zoo.tw'];
usort($data, function($a, $b) {
return strlen($a) <=> strlen($b); // PHP 7+ 太空船運算子
});
// ['jay@zoo.tw', 'joe@host.com', 'john.doe@gh.co.uk', 'asmithsonian@us.info']
// 保留鍵名的自定義排序
uasort($arr, 'cmp_func'); // 依值
uksort($arr, 'cmp_func'); // 依鍵
?>
多維陣列 / 多欄位排序:array_multisort
<?php
$data = [
['id'=>1, 'name'=>'Boney M', 'rating'=>3],
['id'=>2, 'name'=>'Take That', 'rating'=>1],
['id'=>3, 'name'=>'The Killers','rating'=>4],
['id'=>4, 'name'=>'Lusain', 'rating'=>3],
];
// 先按 rating 升序,rating 相同再按 name 升序
$rating = array_column($data, 'rating');
$name = array_column($data, 'name');
array_multisort($rating, SORT_ASC, $name, SORT_ASC, $data);
/* 結果:
Take That (1)
Boney M (3) ← name 排序
Lusain (3)
The Killers (4)
*/
?>
排序旗標常用組合
| 旗標 | 說明 |
SORT_REGULAR | 一般比較 (預設) |
SORT_NUMERIC | 數值比較 |
SORT_STRING | 字串比較 |
SORT_LOCALE_STRING | 依當前 locale 字串比較 |
SORT_NATURAL | 自然排序 (PHP 5.4+) |
SORT_FLAG_CASE | 不區分大小寫 (搭配 SORT_STRING) |
效能提示
- 大量資料排序 → 盡在 SQL
ORDER BY 完成
- PHP 端排序前先
array_column 提取欄位,避免重複存取
- 穩定排序需求 (PHP 8.0+
sort 已穩定) 注意版本差異