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

PHP 二維陣列排序:array_multisort 與 usort 兩大實戰方案

     編輯:PHP 相關知識

常需對二維陣列(如使用者清單)按特定欄位排序。PHP 提供 array_multisort(需提取欄位)與 usort(自訂比較函數)兩種主流做法。本文詳細比較並提供程式碼範例。

測試資料

$users = [
    ['name' => 'tom',  'age' => 20],
    ['name' => 'anny', 'age' => 18],
    ['name' => 'jack', 'age' => 22],
];

方案一:array_multisort(官方標準做法)

步驟:提取排序欄位 → 建立輔助陣列 → 呼叫 array_multisort。

<?php
// 1. 提取 age 欄位
$ages = array_column($users, 'age'); // PHP 5.5+
// 或 foreach ($users as $u) $ages[] = $u['age'];

// 2. 排序:age 升序 (SORT_ASC)
array_multisort($ages, SORT_ASC, $users);

// 結果:anny(18), tom(20), jack(22)
print_r($users);
?>

多欄位排序(先 age 升序,再 name 升序)

<?php
$ages  = array_column($users, 'age');
$names = array_column($users, 'name');
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);

方案二:usort(彈性最高,支援複雜邏輯)

直接撰寫比較函數,回傳 -1, 0, 1(或 <=> 太空船運算子 PHP 7+)。

<?php
// 依 age 升序
usort($users, function($a, $b) {
    return $a['age'] <=> $b['age']; // PHP 7+
    // PHP 5.6: return $a['age'] - $b['age'];
});

// 依 name 長度降序(複雜邏輯範例)
usort($users, function($a, $b) {
    $al = strlen($a['name']);
    $bl = strlen($b['name']);
    if ($al === $bl) return 0;
    return ($al > $bl) ? -1 : 1; // 降序
});

效能與選擇指南

維度array_multisortusort
程式碼長度需額外提取欄位單一閉包搞定
多欄位排序原生支援,語法清晰需在閉包內手寫邏輯
複雜比較邏輯不支援(僅標量比較)完全支援(任意 PHP 程式碼)
記憶體額外建立輔助陣列原地排序,無額外記憶體
速度(小資料)極快(C 實作)略慢(呼叫 PHP 閉包)
適用場景標準欄位排序、多欄位自訂邏輯、物件排序、動態規則

進階:PHP 7.4+ 箭頭函數簡寫

<?php
// 依 age 升序
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);

// 多欄位:age 升序、name 降序
usort($users, fn($a, $b) => 
    ($a['age'] <=> $b['age']) ?: ($b['name'] <=> $a['name']))
);

結論

  • 簡單欄位排序 → array_multisort + array_column 最標準、效能佳。
  • 複雜/動態排序規則 → usort 彈性最高,程式碼更集中。
  • PHP 7.4+ 專案建議善用 fn() 箭頭函數與 <=> 太空船運算子,程式碼極度精簡。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved