從資料庫撈取多筆記錄後,常需依某欄位(如價格、建立時間、瀏覽數)排序。PHP 內建 array_multisort() 可高效完成此任務,無需自寫排序演算法。
<?php
/**
* 多維陣列依欄位排序
* @param array &$array 參考傳遞,直接修改原陣列
* @param string $field 排序依據的鍵名
* @param bool $desc true 為降序,false 為升序(預設)
* @return void
*/
function sortArrByField(array &$array, string $field, bool $desc = false): void {
if (empty($array)) return;
// 提取排序欄位值
$fieldValues = array_column($array, $field);
// 判斷排序旗標
$flag = $desc ? SORT_DESC : SORT_ASC;
// 執行排序,保持索引關聯
array_multisort($fieldValues, $flag, $array);
}
// 使用範例
$products = [
['id' => 1, 'name' => '筆電', 'price' => 25000, 'stock' => 10],
['id' => 2, 'name' => '滑鼠', 'price' => 500, 'stock' => 100],
['id' => 3, 'name' => '螢幕', 'price' => 8000, 'stock' => 5],
['id' => 4, 'name' => '鍵盤', 'price' => 1200, 'stock' => 20],
];
echo "原始順序:\n";
print_r(array_column($products, 'name'));
// 價格升序
sortArrByField($products, 'price', false);
echo "\n價格升序:\n";
print_r(array_column($products, 'name'));
// 庫存降序
sortArrByField($products, 'stock', true);
echo "\n庫存降序:\n";
print_r(array_column($products, 'name'));
若需「先按分類升序,再按價格降序」,可連續呼叫或擴充函式:
function sortArrByFields(array &$array, array $fields): void {
if (empty($array) || empty($fields)) return;
$args = [];
foreach ($fields as $field => $desc) {
$args[] = array_column($array, $field);
$args[] = $desc ? SORT_DESC : SORT_ASC;
}
$args[] = &$array; // 最後加入原陣列參考
array_multisort(...$args);
}
// 使用:先分類升序,再價格降序
sortArrByFields($products, ['category' => false, 'price' => true]);
O(n log n),底層採用 QuickSort/MergeSort 混合演算法。array_column 會建立新陣列,超大資料集(>10萬筆)建議分批處理或改用資料庫 ORDER BY。array_multisort 為穩定排序,相同鍵值保持原相對順序。usort($products, function($a, $b) {
return $a['price'] <=> $b['price']; // 太空船運算子 PHP 7+
});
優點:邏輯彈性高(可處理複雜比較);缺點:效能較差(需繼續呼叫使用者函式),大量資料不建議。
ORDER BY 完成排序,減少 PHP 處理。array_multisort + array_column 最簡潔高效。array_column 回傳 null 導致錯誤。