首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 多維陣列依指定欄位排序最佳實作

     編輯:PHP 相關知識

常見需求

從資料庫撈取多筆記錄後,常需依某欄位(如價格、建立時間、瀏覽數)排序。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。
  • 型別一致:排序欄位值型別應一致(全數字或全字串),混合型別可能導致非預期結果。
  • 穩定性:PHP 8+ array_multisort 為穩定排序,相同鍵值保持原相對順序。

替代方案:usort 自訂比較

usort($products, function($a, $b) {
    return $a['price'] <=> $b['price']; // 太空船運算子 PHP 7+
});

優點:邏輯彈性高(可處理複雜比較);缺點:效能較差(需繼續呼叫使用者函式),大量資料不建議。

最佳實踐建議

  1. 優先在 SQL ORDER BY 完成排序,減少 PHP 處理。
  2. 中小型陣列(<1萬筆)直接用 array_multisort + array_column 最簡潔高效。
  3. 封裝為工具類別或 Trait,專案統一調用。
  4. 排序前驗證欄位是否存在,避免 array_column 回傳 null 導致錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved