通用排序函數
function array_sort(array $arr, string $key, string $type = 'asc') {
$keyValues = [];
foreach ($arr as $k => $v) {
$keyValues[$k] = $v[$key] ?? null; // 鍵不存在視為 null
}
$type === 'asc' ? asort($keyValues) : arsort($keyValues);
$sorted = [];
foreach ($keyValues as $k => $v) {
$sorted[] = $arr[$k];
}
return $sorted;
}
使用範例
$data = [
['name' => 'Js', 'date' => '2014-05-01'],
['name' => 'Sh', 'date' => '2014-04-30'],
['name' => 'Bj', 'date' => '2014-05-02'],
];
// 依 date 升序
$sorted = array_sort($data, 'date');
print_r($sorted);
/*
Array
(
[0] => Array ( [name] => Sh [date] => 2014-04-30 )
[1] => Array ( [name] => Js [date] => 2014-05-01 )
[2] => Array ( [name] => Bj [date] => 2014-05-02 )
)
*/
// 依 name 降序
$sortedDesc = array_sort($data, 'name', 'desc');
進階:支援多鍵值排序
function array_multisort_custom(array $arr, array $criteria) {
// $criteria = [['key'=>'date','order'=>'asc'], ['key'=>'name','order'=>'desc']]
$sortArrays = [];
foreach ($criteria as $c) {
$vals = array_column($arr, $c['key']);
$sortArrays[] = $vals;
$sortArrays[] = $c['order'] === 'asc' ? SORT_ASC : SORT_DESC;
}
$sortArrays[] = &$arr; // 最後加入原陣列引用
array_multisort(...$sortArrays);
return $arr;
}
效能提示
- 資料量 < 10,000 筆:上述函數足夠。
- 大量資料:建議在 SQL 層完成
ORDER BY,減少記憶體與 CPU 開銷。
- PHP 8.1+ 可用
array_is_list() 檢查索引連續性。
常見錯誤避坑
- 鍵名拼寫錯誤:
$v[$key] 回傳 null 導致所有項目視為相同值,排序失效。建議加 ?? null 或拋出例外。
- 原始索引保留:函數回傳重新索引(0,1,2...)陣列,若需保留原鍵,改用
$sorted[$k] = $arr[$k];。
- 混合型別比較:字串與數字混排可能產生非預期順序,預先統一型別(如
strtotime() 轉時間戳)。