php数组排序算法

PHP数组排序优先使用内置函数(如sort、usort等),其底层由C实现且高效;手动实现时可选冒泡、选择或快速排序等算法,但仅适用于学习或特殊场景。

PHP中数组排序不仅依赖算法,更常用的是内置函数来实现。虽然底层会涉及经典排序算法,但开发者通常通过函数调用完成操作。以下是常见排序方式和其背后的逻辑。

1. PHP内置排序函数(最常用)

PHP提供了多个函数用于数组排序,适合大多数实际开发场景:

  • sort():对索引数组进行升序排序,重置键名
  • rsort():降序排序索引数组
  • asort():按值对关联数组升序排序,保留键值关联
  • arsort():按值降序排序关联数组
  • ksort():按键名升序排序关联数组
  • krsort():按键名降序排序
  • usort():使用自定义比较函数排序数组

示例:

$fruits = ['banana', 'apple', 'orange'];
sort($fruits);
// 结果:['apple', 'banana', 'orange']

2. 常见排序算法在PHP中的实现

如果需要手动实现排序算法(如面试或学习),以下是几种经典算法的PHP写法:

冒泡排序(Bubble Sort)

function bubbleSort($arr) {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    return $arr;
}

选择排序(Selection Sort)

function selectionSort($arr) {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        $minIndex = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($arr[$j] < $arr[$minIndex]) {
                $minIndex = $j;
            }
        }
        if ($minIndex != $i) {
            $temp = $arr[$i];
            $arr[$i] = $arr[$minIndex];
            $arr[$minIndex] = $temp;
        }
    }
    return $arr;
}

快速排序(Quick Sort)

function quickSort($arr) {
    if (count($arr) <= 1) {
        return $arr;
    }
    $pivot = $arr[0];
    $left = $right = [];
    for ($i = 1; $i < count($arr); $i++) {
        if ($arr[$i] < $pivot) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    return array_merge(quickSort($left), [$pivot], quickSort($right));
}

3. 自定义排序与多维数组排序

处理复杂数据时,比如按多维数组中某个字段排序,可用 usort 配合匿名函数:

$users = [
    ['name' => 'Alice', 'age' => 30],
    ['name' => 'Bob', 'age' => 25],
    ['name' => 'Charlie', 'age' => 35]
];

usort($users, function($a, $b) { return $a['age'] <=> $b['age']; // 升序 });

使用“”太空船运算符可简化比较逻辑。

4. 性能与选择建议

不同算法适用场景不同:

  • 冒泡排序简单但效率低,适合教学或小数据集
  • 选择排序比冒泡略优,但仍为 O(n²)
  • 快速排序平均性能为 O(n log n),适合大数据
  • 实际开发优先使用 sort()、usort() 等内置函数,它们底层用C实现,效率更高

基本上就这些。日常开发用内置函数足够,理解算法有助于深入掌握逻辑。