核心函數
<?php
/**
* 二維陣列按指定鍵排序
* @param array $arr 待排序陣列
* @param string $key 排序依據的鍵名
* @param string $order 'asc' 升序 | 'desc' 降序
* @return array 排序後的陣列(保留原鍵)
*/
function array_sort($arr, $key, $order = 'asc') {
if (empty($arr) || !is_array($arr)) return $arr;
// 1. 提取排序鍵值
$keyValues = [];
foreach ($arr as $k => $v) {
if (!isset($v[$key])) continue; // 跳過缺鍵項
$keyValues[$k] = $v[$key];
}
// 2. 排序鍵值陣列(保持索引關聯)
if ($order === 'asc') {
asort($keyValues, SORT_REGULAR);
} else {
arsort($keyValues, SORT_REGULAR);
}
// 3. 依排序後的索引重組原陣列
$sorted = [];
foreach ($keyValues as $k => $v) {
$sorted[$k] = $arr[$k];
}
return $sorted;
}
?>
使用範例
<?php
$products = [
101 => ['name' => '筆電', 'price' => 35000, 'stock' => 10],
102 => ['name' => '滑鼠', 'price' => 500, 'stock' => 200],
103 => ['name' => '螢幕', 'price' => 8000, 'stock' => 30],
104 => ['name' => '鍵盤', 'price' => 1200, 'stock' => 50],
];
// 價格升序
$byPriceAsc = array_sort($products, 'price', 'asc');
/*
102 => ['name' => '滑鼠', 'price' => 500, ...]
104 => ['name' => '鍵盤', 'price' => 1200, ...]
103 => ['name' => '螢幕', 'price' => 8000, ...]
101 => ['name' => '筆電', 'price' => 35000, ...]
*/
// 庫存降序
$byStockDesc = array_sort($products, 'stock', 'desc');
/*
102 => ['name' => '滑鼠', 'stock' => 200, ...]
104 => ['name' => '鍵盤', 'stock' => 50, ...]
103 => ['name' => '螢幕', 'stock' => 30, ...]
101 => ['name' => '筆電', 'stock' => 10, ...]
*/
?>
進階:多鍵排序(如價格升序、庫存降序)
<?php
function array_multisort_keys(array $arr, array $criteria) {
// $criteria = [['key' => 'price', 'order' => 'asc'], ['key' => 'stock', '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;
}
$multi = array_multisort_keys($products, [
['key' => 'price', 'order' => 'asc'],
['key' => 'stock', 'order' => 'desc'],
]);
?>
效能與替代方案
| 方法 | 時間複雜度 | 記憶體 | 適用場景 |
array_sort() (本文) | O(n log n) | O(n) | 單鍵排序,保留原鍵 |
array_multisort() 原生 | O(n log n) | O(n) | 多鍵排序,官方推薦 |
usort() 自定義比較 | O(n log n) | O(1) | 複雜邏輯(如日期字串、多欄位混合) |
SQL ORDER BY | DB 引擎優化 | 不佔 PHP 記憶體 | 資料源頭即可排序時(首選) |
常見錯誤
- 直接用
sort():會重置數字索引,丟失原鍵關聯
- 鍵值型別不一致:字串 '100' vs 整數 100,排序結果不同,建議統一轉型
- 缺鍵項未處理:會導致 Notice 或排序錯誤,函數中已用
isset() 過濾