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

PHP 一維數組排序函數全解析:sort/asort/ksort/uasort 選型指南

     編輯:PHP 相關知識

核心函數對照表

函數排序依據順序保留鍵名返回值典型場景
sort()值升序❌ 重建 0..n 索引bool純數值列表、不關心鍵名
rsort()值降序❌bool同上,需倒序
asort()值升序✅bool關聯數組按值排序,保持鍵值對應
arsort()值降序✅bool同上,倒序
ksort()鍵名升序✅bool按鍵名字母/數字排序(如配置項)
krsort()鍵名降序✅bool同上,倒序
usort()值(自定義)自定❌bool複雜值比較(對象、多維、自然序)
uasort()值(自定義)自定✅bool關聯數組複雜排序
uksort()鍵名(自定義)自定✅bool鍵名自定義排序(如版本號鍵)
natsort()值(自然序)升序✅bool含數字字符串:img2.png < img10.png
natcasesort()值(自然序、不分大小寫)升序✅bool同上,忽略大小寫

基礎排序實戰演示

<?php
$data = ['a' => 5, 0 => 2, 'b' => 8, 1 => 1];

echo "原始: "; print_r($data);

// sort() - 不保留鍵名
$arr = $data;
sort($arr);
echo "sort: "; print_r($arr);  // [0=>1, 1=>2, 2=>5, 3=>8]

// asort() - 保留鍵名
$arr = $data;
asort($arr);
echo "asort: "; print_r($arr); // [1=>1, 0=>2, 'a'=>5, 'b'=>8]

// ksort() - 按鍵名
$arr = $data;
ksort($arr);
echo "ksort: "; print_r($arr); // [0=>2, 1=>1, 'a'=>5, 'b'=>8] (數字鍵在前)
?>

自定義比較函數:三大核心

比較函數規範

function cmp(mixed $a, mixed $b): int
{
    // 返回:負數($a<$b)、0($a==$b)、正數($a>$b)
    // PHP 7+ 推薦使用太空船操作符 <=>
    return $a <=> $b;  // 升序
    // return $b <=> $a; // 降序
}

usort:值排序 + 重建索引

$arr = [3, 1, 4, 1, 5, 9];
usort($arr, fn($a, $b) => $b <=> $a); // 降序
// [9, 5, 4, 3, 1, 1]

uasort:關聯數組值排序 + 保留鍵名

$scores = ['張三' => 85, '李四' => 92, '王五' => 85, '趙六' => 78];
// 分數降序,同分按姓名升序
uasort($scores, function($a, $b) {
    return $b <=> $a ?: strcmp($a, $b); // 注意:這裡 $a/$b 是值,無法直接獲取鍵名
});
// 實際需同時比較鍵名時,建議用 uksort 或先轉為 [['name'=>..., 'score'=>...]] 結構

uksort:鍵名自定義排序(如版本號)

$versions = [
    'v1.2.10' => '...',
    'v1.2.9'  => '...',
    'v1.10.1' => '...',
    'v1.0.0'  => '...',
];

uksort($versions, function($a, $b) {
    // 移除 'v' 前綴,按點分割,逐段數值比較
    $a = array_map('intval', explode('.', ltrim($a, 'v')));
    $b = array_map('intval', explode('.', ltrim($b, 'v')));
    return $a <=> $b;
});

/* 結果順序:
v1.0.0
v1.2.9
v1.2.10
v1.10.1
*/

進階技巧與陷阱

1. 多維數組按某欄位排序

$users = [
    ['name' => 'A', 'age' => 25],
    ['name' => 'B', 'age' => 20],
    ['name' => 'C', 'age' => 30],
];

// PHP 5.5+ array_column + array_multisort (高效、推薦)
array_multisort(array_column($users, 'age'), SORT_ASC, $users);

/* 或 PHP 7.4+ 箭頭函數 usort */
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 保留原鍵名需用 uasort

2. 自然排序:人類直覺順序

$files = ['img1.png', 'img10.png', 'img2.png', 'img20.png'];
sort($files);      // ['img1.png', 'img10.png', 'img2.png', 'img20.png'] ❌
natsort($files);   // ['img1.png', 'img2.png', 'img10.png', 'img20.png'] ✅

3. 大小寫不敏感排序

$arr = ['Apple', 'banana', 'Cherry'];
sort($arr, SORT_FLAG_CASE | SORT_STRING); 
// ['Apple', 'banana', 'Cherry'] (ASCII 碼順序)
natcasesort($arr); 
// ['Apple', 'banana', 'Cherry'] (自然序+忽略大小寫)

4. 陷阱:引用傳遞與返回值

  • 所有排序函數直接修改原數組,返回 bool 而非新數組
  • 錯誤用法:$new = sort($arr); → $new = true
  • 需保留原數組請先 $copy = $arr; sort($copy);

性能微基準(參考)

數組大小: 10,000 元素
sort()           : ~1.2 ms
asort()          : ~1.5 ms
usort(箭頭函數)  : ~3.8 ms
usort(閉包)      : ~5.2 ms
uksort(複雜比較) : ~8.5 ms

選型口訣:值排序不留鍵→sort/rsort;值排序留鍵→asort/arsort;鍵排序→ksort/krsort;邏輯複雜→usort/uasort/uksort;含數字字符串→natsort;多維按列→array_multisort。

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