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

PHP 一維/二維數組排序總結:冒泡教學、array_multisort 實戰、內置函數速查

     編輯:PHP 相關知識

教學級:冒泡排序實現(理解原理用)

function bubble_sort(array $array, ?string $key = null): array {
    $count = count($array);
    if ($count < 2) return $array;

    for ($i = 0; $i < $count; $i++) {
        for ($j = $count - 1; $j > $i; $j--) {
            $valJ   = $key ? ($array[$j][$key]   ?? null) : $array[$j];
            $valJ_1 = $key ? ($array[$j-1][$key] ?? null) : $array[$j-1];
            
            if ($valJ !== null && $valJ_1 !== null && $valJ < $valJ_1) {
                [$array[$j], $array[$j-1]] = [$array[$j-1], $array[$j]]; // PHP 7.1+ 解構賦值
            }
        }
    }
    return $array;
}

複雜度: O(n²),僅供學習算法原理,生產環境嚴禁使用。

生產級:array_multisort 多字段排序(標準姿勢)

$data = [
    ['volume'=>67, 'edition'=>2],
    ['volume'=>86, 'edition'=>1],
    ['volume'=>85, 'edition'=>6],
    ['volume'=>98, 'edition'=>2],
    ['volume'=>86, 'edition'=>6],
    ['volume'=>67, 'edition'=>7],
];

// 1. 提取排序列 (PHP 5.5+ array_column)
$volume  = array_column($data, 'volume');
$edition = array_column($data, 'edition');

// 2. 多字段排序:volume 降序,edition 升序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

// 結果:volume 98→86→86→85→67→67;同 volume 時 edition 1→6→2→7

一維數組排序速查

函數說明鍵名示例
sort()值升序重建 0..nsort($arr)
rsort()值降序重建rsort($arr)
asort()值升序保留關聯asort($arr)
arsort()值降序保留關聯arsort($arr)
ksort()鍵名升序保留ksort($arr)
krsort()鍵名降序保留krsort($arr)
shuffle()隨機打亂重建shuffle($arr)
array_reverse()反轉順序保留array_reverse($arr)

二維數組自定義排序:usort/uasort + 太空船操作符

$users = [
    ['name'=>'A', 'age'=>25, 'score'=>90],
    ['name'=>'B', 'age'=>20, 'score'=>95],
    ['name'=>'C', 'age'=>25, 'score'=>85],
];

// 年齡升序,同齡分數降序
uasort($users, fn($a, $b) => 
    ($a['age'] <=> $b['age']) ?: ($b['score'] <=> $a['score'])
);
// 保留鍵名,適用關聯數組

自定義數字數組排序(教學示例)

function sortArray(array $array, bool $asc = true): array {
    $values = array_values($array);
    $result = [];
    while ($values) {
        $extreme = $asc ? min($values) : max($values);
        $key = array_search($extreme, $values, true);
        $result[] = $extreme;
        unset($values[$key]);
        $values = array_values($values); // 重建索引
    }
    return $result;
}

// 用法
$nums = [100, 1000, 1, 10000];
print_r(sortArray($nums, false)); // 降序:10000, 1000, 100, 1

總結建議

  • 學習算法:冒泡/快排/歸併理解原理即可
  • 一維排序:直接用 sort/asort/ksort 族
  • 二維多字段:array_multisort + array_column 最優
  • 複雜邏輯:uasort + 太空船操作符 代碼最簡潔
  • 性能:內置函數 C 級實現,遠超用戶態 PHP 循環
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved