PHP数组排序与查找算法实现排序和查找是编程中最基础的算法。PHP内置了sort、asort、ksort等排序函数底层用C实现性能很好。但有些场景需要自定义排序逻辑或者需要理解算法的原理。先说说PHP内置的排序函数。sort按值升序排序rsort按值降序排序asort保持键值关联的升序排序ksort按键名升序排序。php$numbers [5, 3, 8, 1, 9, 2, 7, 4, 6];sort($numbers);echo 升序: . implode(, , $numbers) . \n;rsort($numbers);echo 降序: . implode(, , $numbers) . \n;// 关联数组排序$ages [张三 28, 李四 35, 王五 22, 赵六 30];asort($ages);echo 按年龄升序:\n;foreach ($ages as $name $age) {echo $name: $age\n;}ksort($ages);echo 按姓名排序:\n;foreach ($ages as $name $age) {echo $name: $age\n;}// 自定义排序$products [[name 商品A, price 100, sales 50],[name 商品B, price 200, sales 30],[name 商品C, price 150, sales 80],];usort($products, fn($a, $b) $b[sales] $a[sales]);echo 按销量降序:\n;print_r($products);// 多字段排序usort($products, function ($a, $b) {// 销量相同则按价格升序if ($a[sales] $b[sales]) {return $a[price] $b[price];}return $b[sales] $a[sales];});?手写排序算法可以加深理解但生产环境用内置函数就够了。php// 冒泡排序function bubbleSort(array $arr): array{$n count($arr);for ($i 0; $i $n - 1; $i) {$swapped false;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;$swapped true;}}if (!$swapped) break;}return $arr;}// 快速排序function quickSort(array $arr): array{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));}$test [5, 3, 8, 1, 9, 2, 7, 4, 6];echo 冒泡排序: . implode(, , bubbleSort($test)) . \n;echo 快速排序: . implode(, , quickSort($test)) . \n;echo 内置sort: ;sort($test);echo implode(, , $test) . \n;?查找算法中二分查找是最常用的。php// 二分查找数组必须有序function binarySearch(array $arr, int $target): int{$left 0;$right count($arr) - 1;while ($left $right) {$mid $left intdiv($right - $left, 2);if ($arr[$mid] $target) {return $mid;}if ($arr[$mid] $target) {$left $mid 1;} else {$right $mid - 1;}}return -1;}// 递归版二分查找function binarySearchRecursive(array $arr, int $target, int $left, int $right): int{if ($left $right) return -1;$mid $left intdiv($right - $left, 2);if ($arr[$mid] $target) return $mid;if ($arr[$mid] $target) {return binarySearchRecursive($arr, $target, $mid 1, $right);}return binarySearchRecursive($arr, $target, $left, $mid - 1);}$sorted range(1, 100);$target 73;$pos binarySearch($sorted, $target);echo 二分查找: {$target} 在位置 {$pos}\n;$pos2 binarySearchRecursive($sorted, $target, 0, count($sorted) - 1);echo 递归二分查找: {$target} 在位置 {$pos2}\n;// 实际开发中用PHP内置函数$pos3 array_search($target, $sorted);echo 内置array_search: {$target} 在位置 {$pos3}\n;?数组去重和合并也是常见操作。php$arr1 [1, 2, 3, 4, 5, 6];$arr2 [4, 5, 6, 7, 8, 9];// 交集$intersect array_intersect($arr1, $arr2);echo 交集: . implode(, , $intersect) . \n;// 差集$diff array_diff($arr1, $arr2);echo 差集(arr1有arr2没有): . implode(, , $diff) . \n;// 并集$union array_unique(array_merge($arr1, $arr2));echo 并集: . implode(, , $union) . \n;// 数组去重$duplicates [1, 2, 2, 3, 3, 3, 4, 5, 5];$unique array_unique($duplicates);echo 去重: . implode(, , $unique) . \n;// 关联数组合并$defaults [timeout 30, retry 3, debug false];$userConfig [timeout 60, debug true];$merged array_merge($defaults, $userConfig);print_r($merged);?多维数组排序可以用array_multisort。php$data [[name 张三, age 28, score 85],[name 李四, age 35, score 92],[name 王五, age 22, score 78],[name 赵六, age 30, score 95],];// 提取列$ages array_column($data, age);$scores array_column($data, score);// 按年龄升序年龄相同按分数降序array_multisort($ages, SORT_ASC, $scores, SORT_DESC, $data);echo 按年龄升序年龄相同按分数降序:\n;print_r($data);?排序算法的时间复杂度对比- 冒泡排序: O(n²)- 快速排序: O(n log n)- 内置sort: O(n log n)C实现数据量大时内置sort比手写的快几十倍。所以真的只是学习用别在生产环境手写排序