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

PHP array_multisort() 多維陣列排序完全指南:參數詳解與實戰技巧

     編輯:PHP 相關知識

PHP array_multisort() 多維陣列排序完全指南:參數詳解與實戰技巧

`array_multisort()` 是 PHP 排序多個陣列或多維陣列的利器,支援混合排序順序與類型。本文詳細拆解參數語法、排序標誌組合、鍵名保留行為,並給出二維陣列多欄位排序最佳實踐。

函數簽名與返回值

array_multisort(array &$array1, mixed $array1_sort_order = SORT_ASC, mixed $array1_sort_flags = SORT_REGULAR, mixed ...$rest): bool
  • 成功返回 `true`,失敗返回 `false`
  • **傳址修改**原陣列,不返回新陣列
  • 可同時排序多個陣列,視為「表格列」按行排序 (類似 SQL `ORDER BY col1, col2`)

排序標誌完整表

分類常量說明
順序SORT_ASC升序 (預設)
SORT_DESC降序
類型SORT_REGULAR常規比較 (不轉型,預設)
SORT_NUMERIC數值比較
SORT_STRING字串比較 (區分大小寫,大寫優先)
SORT_NATURAL自然排序 (如 "img2" < "img10")
SORT_FLAG_CASE配合 SORT_STRING/NATURAL 忽略大小寫

規則:每個陣列後只能跟一個順序標誌 + 一個類型標誌。標誌僅對緊前的陣列生效,預設 `SORT_ASC | SORT_REGULAR`。

核心行為:鍵名處理

  • 字串鍵:保留原鍵名
  • 數字鍵:重新索引 0, 1, 2... (關聯關係隨值移動)

實戰:二維陣列多欄位排序

場景

$users = [
    ['id' => 3, 'name' => 'Alice', 'age' => 25],
    ['id' => 1, 'name' => 'Bob',   'age' => 28],
    ['id' => 2, 'name' => 'Alice', 'age' => 22],
    ['id' => 4, 'name' => 'Charlie','age' => 25],
];
// 需求:id 降序、name 升序、age 升序

標準寫法:提取欄位陣列再排序

// 1. 提取排序欄位
$ids   = array_column($users, 'id');
$names = array_column($users, 'name');
$ages  = array_column($users, 'age');

// 2. 多重排序 (最後一個參數必須是原資料陣列)
array_multisort(
    $ids,   SORT_DESC, SORT_NUMERIC,  // id 降序、數值比較
    $names, SORT_ASC,  SORT_STRING,   // name 升序、字串比較
    $ages,  SORT_ASC,  SORT_NUMERIC,  // age 升序、數值比較
    $users  // 原陣列跟著重排
);

print_r($users);

輸出結果

Array
(
    [0] => Array ( [id] => 4 [name] => Charlie [age] => 25 )
    [1] => Array ( [id] => 3 [name] => Alice   [age] => 25 )
    [2] => Array ( [id] => 2 [name] => Alice   [age] => 22 )
    [3] => Array ( [id] => 1 [name] => Bob     [age] => 28 )
)

進階技巧

1. 保留原始鍵名 (關聯陣列)

$data = [
    'a' => ['score' => 90],
    'b' => ['score' => 95],
    'c' => ['score' => 90],
];
// 使用 array_multisort 會重置數字鍵,字串鍵保留
$scores = array_column($data, 'score');
array_multisort($scores, SORT_DESC, $data);
// 結果鍵仍為 a,b,c

2. 忽略大小寫自然排序 (文件名、版本號)

$files = ['img1.png', 'img10.png', 'Img2.png', 'img20.png'];
array_multisort($files, SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE);
// 結果:['img1.png', 'Img2.png', 'img10.png', 'img20.png']

3. 物件陣列排序 (PHP 7+)

class User { public $id; public $name; }
$users = [new User(3,'C'), new User(1,'A'), new User(2,'B')];

$ids = array_map(fn($u) => $u->id, $users);
array_multisort($ids, SORT_ASC, $users);

4. 結合 usort 彈性比較 (複雜邏輯)

usort($users, function($a, $b) {
    // 先按角色權重排,再按 id
    $roleWeight = ['admin'=>3, 'editor'=>2, 'user'=>1];
    $diff = ($roleWeight[$b->role] ?? 0) - ($roleWeight[$a->role] ?? 0);
    return $diff ?: $a->id - $b->id;
});

常見錯誤與避坑

錯誤原因修正
Warning: Array sizes are inconsistent參與排序的陣列長度不一致確保所有陣列 (含原資料) 元素數量相同
排序結果不符預期字串比較 "10" < "2"加 `SORT_NUMERIC` 或 `SORT_NATURAL`
大小寫順序錯亂SORT_STRING 大寫優先加 `SORT_FLAG_CASE` 忽略大小寫
原陣列未變化忘記傳址 (&) 或參數順序錯最後一個參數必須是原陣列變數

效能提示

  • 大數據量 (10萬+) 時,`array_multisort` 比多次 `usort` 快 (C 底層實現)
  • 極大陣列考慮分塊排序或資料庫 `ORDER BY` 下推
  • 頻繁排序同一資料集,維護已排序索引陣列避免重複提取

一句話精髓:提取欄位 → 組合標誌 → 最後傳原陣列,記住「字串鍵保留、數字鍵重索引、標誌只管前一個陣列」。

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