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

PHP array_multisort() 多維陣列排序完全指南:多鍵值、大小寫不敏感、自然排序

     編輯:PHP 綜合知識

array_multisort() 是 PHP 排序利器:可同時排序多個陣列,或依多維陣列的某一/多欄位排序(類似 SQL ORDER BY col1 ASC, col2 DESC)。本文系統整理語法、參數、常見陷阱與實戰範例。

語法與參數詳解

<?php
array_multisort(
    array &$array1,          // 必須:主要排序陣列
    int $sort_order = SORT_ASC,  // 可選:SORT_ASC / SORT_DESC
    int $sort_type = SORT_REGULAR, // 可選:排序型別
    array &$array2, ...      // 可選:次要排序陣列(同步排序)
): bool
?>

排序順序($sort_order)

  • SORT_ASC:升序(預設)
  • SORT_DESC:降序

排序型別($sort_type)

  • SORT_REGULAR:預設,ASCII 碼比較(不轉型)
  • SORT_NUMERIC:數值比較
  • SORT_STRING:字串比較
  • SORT_LOCALE_STRING:依 setlocale() 當前地區設定比較
  • SORT_NATURAL:自然排序(如 natsort(),img2.png < img10.png)
  • SORT_FLAG_CASE:配合 SORT_STRING|SORT_NATURAL 忽略大小寫

關鍵行為

  • 字串鍵名保留,數字鍵名重新索引(從 0 遞增)。
  • 多陣列同步排序:第一個陣列值相同時,按第二個陣列對應值排序,以此類推。
  • 回傳 true/false,原陣列被修改(引用傳遞)。

實戰範例

例 1:多維陣列按多欄位排序

<?php
$data = [
    ['name' => 'Alice', 'age' => 25, 'score' => 88],
    ['name' => 'Bob',   'age' => 25, 'score' => 92],
    ['name' => 'Charlie','age' => 22, 'score' => 90],
];

// 先按 age 升序,age 同則按 score 降序
$age   = array_column($data, 'age');
$score = array_column($data, 'score');
array_multisort($age, SORT_ASC, SORT_NUMERIC,
                $score, SORT_DESC, SORT_NUMERIC,
                $data); // $data 同步重排

print_r($data);
/* 結果:
Charlie 22 90
Bob     25 92
Alice   25 88
*/
?>

例 2:不區分大小寫字母排序

<?php
$arr = ['Alpha', 'atomic', 'Beta', 'bank'];
$lower = array_map('strtolower', $arr);
array_multisort($lower, SORT_ASC, SORT_STRING | SORT_FLAG_CASE, $arr);
// 或 PHP 5.4+ 直接:
// array_multisort($arr, SORT_ASC, SORT_STRING | SORT_FLAG_CASE);
print_r($arr); // Alpha, atomic, bank, Beta
?>

例 3:自然排序(檔名、版本號)

<?php
$files = ['img1.png', 'img10.png', 'img2.png', 'img20.png'];
array_multisort($files, SORT_ASC, SORT_NATURAL);
print_r($files); // img1, img2, img10, img20
?>

例 4:同時排序多個獨立陣列(同步索引)

<?php
$ids = [3, 1, 2];
$names = ['C', 'A', 'B'];
array_multisort($ids, SORT_ASC, $names);
// $ids => [1,2,3], $names => ['A','B','C']
?>

常見坑點與避坑

  1. 參數必須是變數(引用),不能直接傳遞表達式:array_multisort(array_column($data,'age'), ...) ❌ → 先存變數 ✅。
  2. 數字鍵名會重置,關聯鍵名保留。需保留數字鍵請改用 uksort() 或 uasort()。
  3. 排序型別不匹配:字串數字 '10' 用 SORT_STRING 會排在 '2' 前面,必須用 SORT_NUMERIC。
  4. SORT_LOCALE_STRING 需先 setlocale(LC_COLLATE, 'zh_TW.utf8'),否則退回預設。

替代方案對比

函數適用場景特點
array_multisort多欄位、多陣列同步排序效能最好(C 實現),語法稍繁
usort/uasort/uksort複雜自定義比較邏輯彈性最大,需寫 callback,較慢
natsort/natcasesort自然排序(單陣列)簡潔,保留鍵名

總結

array_multisort() 是處理「類 SQL 多欄位排序」的標準工具。掌握 SORT_NUMERIC、SORT_NATURAL、SORT_FLAG_CASE 組合技,能解決 90% 的陣列排序需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved