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

PHP 多維陣列分組排序:以 array_multisort 實現 SQL 風格 ORDER BY

     編輯:PHP 綜合知識

情境

資料結構為二維陣列,每筆包含三欄位(A、B、C)。需求:主要依 A 欄升序,次要依 C 欄降序,B 欄不參與排序但需保留。

<?php
$list = [
    [2, 3, 5],
    [2, 5, 24],
    [3, 8, 6],
    [3, 2, 10],
    [4, 7, 20],
    [4, 1, 15],
    [6, 4, 10],
    [7, 9, 20],
];

方法一:array_multisort(推薦)

提取排序欄位組成獨立陣列,再以 array_multisort 多鍵值排序,最後一參數傳入原陣列(引用),達成同步排序。

<?php
$a = $c = [];
foreach ($list as $row) {
    $a[] = $row[0]; // A 欄
    $c[] = $row[2]; // C 欄
}
// 相當於 SQL: ORDER BY a ASC, c DESC
array_multisort($a, SORT_ASC, $c, SORT_DESC, $list);
print_r($list);

優點:內建函式、效能佳、語意清晰、支援多層級排序。

方法二:氣泡排序手寫(教學用)

<?php
for ($j = 0; $j < count($list); $j++) {
    for ($i = count($list) - 1; $i > $j; $i--) {
        if ($list[$i][0] == $list[$i-1][0] && $list[$i][2] > $list[$i-1][2]) {
            list($list[$i], $list[$i-1]) = [$list[$i-1], $list[$i]];
        }
    }
}

缺點:O(n²) 複雜度、僅適用極小資料量、易出錯、維護困難。

進階:針對關聯式陣列排序

<?php
$data = [
    ['id'=>1, 'score'=>90, 'age'=>20],
    ['id'=>2, 'score'=>90, 'age'=>18],
    ['id'=>3, 'score'=>85, 'age'=>22],
];
$score = array_column($data, 'score');
$age   = array_column($data, 'age');
array_multisort($score, SORT_DESC, $age, SORT_ASC, $data);
// 結果:score 降序,同分 age 升序

總結

  • 實務上優先使用 array_multisort,搭配 array_column 提取欄位最簡潔。
  • 手寫排序僅適合教學或極特殊邏輯無法用內建函式表達時。
  • 記得排序欄位陣列順序與 array_multisort 參數順序一一對應。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved