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

PHP 陣列排序三大神器:usort、uksort、sort 完整實戰指南

     編輯:PHP 綜合知識

PHP 提供超過 10 種陣列排序函數,最常用的三把鑰匙是:**sort() 值排序**、**usort() 自訂值排序**、**uksort() 自訂鍵名排序**。本文詳細拆解語法、比較函數撰寫規則、穩定性變化、陣列鍵值保留差異,並給出實戰範例與避坑指南。

一、sort() — 值升序排序(重設索引)

  • **重設數值索引**(0,1,2...),**關聯鍵名會遺失**。
  • 支援旗標:SORT_REGULAR、SORT_NUMERIC、SORT_STRING、SORT_LOCALE_STRING、SORT_NATURAL、SORT_FLAG_CASE。
  • 回傳 bool。
$fruits = ["lemon","orange","banana","apple"];
sort($fruits); // ["apple","banana","lemon","orange"]
// 原鍵名 0,1,2,3 重設為 0,1,2,3

二、usort() — 使用者自訂比較函數排序值(保留關聯鍵名)

  • **保留原有鍵名關聯**,僅重新排序順序。
  • 比較函數簽名:cmp(mixed $a, mixed $b): int,回傳 <0、0、>0 分別代表 $a < $b、$a == $b、$a > $b。
  • **PHP 4.1.0+ 採用新演算法,不保證穩定排序**(相等元素相對順序可能變動)。
$data = [3,2,5,6,1];
usort($data, function($a,$b) {
    return $a <=> $b; // PHP 7+ 太空船運算子,簡潔明瞭
});
// $data = [1,2,3,5,6] (索引重設為 0..4)

多欄位/複雜物件排序範例

$users = [
    ['name'=>'Alice', 'age'=>25, 'score'=>90],
    ['name'=>'Bob',   'age'=>20, 'score'=>95],
    ['name'=>'Cindy', 'age'=>25, 'score'=>85],
];

usort($users, function($a,$b) {
    // 年齡升序、分數降序
    return [$a['age'], -$a['score']] <=> [$b['age'], -$b['score']];
});
/* 結果:
  Bob (20,95)
  Cindy (25,85)
  Alice (25,90)
*/

三、uksort() — 使用者自訂比較函數排序鍵名(保留鍵值關聯)

  • 比較函數接收**兩個鍵名**,根據鍵名決定順序,**鍵值關聯完全保留**。
  • 適合:依特定鍵名順序輸出(如優先級、時間序鍵名)。
$data = [4=>'four', 3=>'three', 20=>'twenty', 10=>'ten'];
uksort($data, function($a,$b) {
    return $a <=> $b; // 數值鍵名升序
});
/* 結果保留鍵名:
  [3=>'three', 4=>'four', 10=>'ten', 20=>'twenty']
*/

四、對照表與選用決策樹

需求函數鍵名處理比較邏輯穩定性
單純值升序/降序sort / rsort重設索引內建不穩定
關聯陣列值排序asort / arsort保留鍵名內建不穩定
自訂值排序邏輯usort重設索引回呼函數不穩定
關聯陣列自訂值排序uasort保留鍵名回呼函數不穩定
自訂鍵名排序邏輯uksort保留鍵名回呼函數不穩定
自然排序(人類直覺)natsort / natcasesort保留鍵名自然順序不穩定

五、常見陷阱與最佳實務

  • 比較函數必須回傳 int:回傳 true/false 或 null 會導致不可預期行為。
  • 太空船運算子 <=>:PHP 7+ 首選,自動處理數值/字串比較,程式碼極簡潔。
  • 需穩定排序:PHP 8.0+ 可用 uasort($arr, fn($a,$b) => $a<=>$b) 搭配 array_values() 重建索引,或自行實作合併排序。
  • 大量資料效能:比較函數內避免重複計算、IO、資料庫查詢;預先計算排序鍵(Schwartzian Transform)。
  • 多維陣列排序:善用 array_column() + array_multisort() 非回呼方式,速度更快。
// 多維陣列依 age 排序(非回呼,極快)
$ages = array_column($users, 'age');
array_multisort($ages, SORT_ASC, $users);

掌握 sort/usort/uksort 三大核心與衍生函數,即能應對 99% 陣列排序場景,寫出高效、可讀、正確的排序邏輯。

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