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

PHP 多維陣列排序神器 array_multisort 完整實戰指南

     編輯:PHP 綜合知識

array_multisort:一次搞定多陣列、多維陣列、資料庫結果集排序

array_multisort() 是 PHP 內建最強大的排序函數,可同時對多個陣列或多維陣列的特定欄位進行複合排序,邏輯類似 SQL 的 ORDER BY col1 ASC, col2 DESC。本文詳細解析參數結構、排序旗標與六大實戰範例。

函數簽名與核心參數

bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] )
  • 排序順序旗標:SORT_ASC(升序)、SORT_DESC(降序)
  • 排序類型旗標:SORT_REGULAR(預設)、SORT_NUMERIC、SORT_STRING、SORT_LOCALE_STRING、SORT_NATURAL、SORT_FLAG_CASE
  • 每個陣列後可跟 0~2 個旗標(順序+類型),旗標僅對該陣列生效。
  • 關聯鍵名保持不變,數字鍵名會重新索引。

範例 1:多個獨立陣列同步排序

<?php
$ar1 = array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);
// $ar1: "10", "a", 100, 100
// $ar2: 1, 1, "2", 3  (對應 $ar1 中 100 的原始順序)
?>

範例 2:多維陣列指定欄位排序

<?php
$ar = array(
    array("10", 100, 100, "a"),
    array(1, 3, "2", 1)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING,   // 第 0 欄字串升序
                $ar[1], SORT_NUMERIC, SORT_DESC); // 第 1 欄數值降序
?>

範例 3:資料庫結果集多欄位排序(最實用)

假設從資料庫取得 $data(每筆為關聯陣列),需按 volume DESC, edition ASC 排序:

<?php
$data = array(
    array('volume'=>67, 'edition'=>2),
    array('volume'=>86, 'edition'=>1),
    array('volume'=>85, 'edition'=>6),
    array('volume'=>98, 'edition'=>2),
    array('volume'=>86, 'edition'=>6),
    array('volume'=>67, 'edition'=>7)
);

// 1. 提取排序欄位陣列
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

// 2. 多鍵排序,最後放入 $data 以同步調整順序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

// 結果:98|2, 86|1, 86|6, 85|6, 67|2, 67|7
?>

範例 4:不分大小寫字串排序

<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lower = array_map('strtolower', $array);
array_multisort($array_lower, SORT_ASC, SORT_STRING, $array);
// 結果:Alpha, atomic, bank, Beta
?>

範例 5:名次排名(分數相同按姓名字母序)

<?php
$grade = array(
    "score" => array(70, 95, 70.0, 60, "70"),
    "name"  => array("Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Liu Qi")
);
array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,
                $grade["name"],  SORT_STRING,  SORT_ASC);
// 李四 95 第1,趙六 60 第5,70分三人按姓名:Liu Qi, Wang Wu, Zhang San
?>

範例 6:物件陣列排序(PHP 5.3+ 匿名函數配合 usort 更直觀)

雖然 array_multisort 也能處理,但現代 PHP 建議對物件陣列使用 usort + 太空船運算子(<=>)或匿名函數,可讀性更高。

效能與注意事項

  • 所有參數均為傳址呼叫,原陣列會被直接修改。
  • 超大陣列(>10 萬筆)排序時記憶體消耗大,考慮資料庫 ORDER BY 前置排序。
  • 混合型別(數字、字串、浮點數)排序行為複雜,建議統一型別或指定 SORT_NUMERIC/SORT_STRING。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved