PHP 数组去重与排序实战
PHP 数组去重与排序实战
一、为什么数组处理是 PHP 基本功
PHP 数组是万能数据结构,接口返回的列表、数据库结果集、表单提交数据都以数组形式存在。日常开发中最常见两个需求:去除重复元素、按字段排序。很多新手用双重循环去重、手写冒泡,既慢又容易出 bug。PHP 内置函数已经把这些操作封装好,关键是分清索引数组和关联数组的不同处理方式。
二、array_unique 去重
最简单的一维数组去重用 array_unique,它保留第一次出现的值,后面重复的被丢弃:
<?php
$ids = [3, 1, 3, 2, 1, 4];
$unique = array_unique($ids);
// 结果 [3,1,2,4],注意键名保留原始索引
print_r($unique);
两点注意:一是去重后键名不连续,需要配合 array_values 重新索引;二是它按字符串比较,数字 1 和字符串 "1" 会被视为相同。
$clean = array_values(array_unique($ids));
三、二维数组按字段去重
查询结果是二维数组,要按某个键去重,array_unique 直接用会失效,常用键值映射法:
$rows = [
['uid' => 1, 'name' => '张三'],
['uid' => 2, 'name' => '李四'],
['uid' => 1, 'name' => '张三'],
];
$map = [];
foreach ($rows as $row) {
$map[$row['uid']] = $row;
}
$result = array_values($map);
利用关联数组键唯一的特性,重复 uid 自动覆盖,最后 array_values 重置索引,时间复杂度 O(n),比双重循环 O(n²) 高效得多。
四、常用排序函数区别
PHP 排序函数容易记混,先分清三组:
- sort() / rsort():按值升序/降序,重建索引,适合索引数组;
- asort() / arsort():按值排序但保留键名,适合关联数组;
- ksort() / krsort():按键名排序。
$scores = ['张三' => 88, '李四' => 95, '王五' => 76]; asort($scores); // 按分数升序,保留人名键
五、二维数组按字段排序
多维数组按某个字段排序,用 usort 配合比较回调:
usort($rows, function ($a, $b) {
return $b['score'] <=> $a['score']; // 分数降序
});
飞船运算符 <=> 返回 -1、0、1,直接作为比较结果,比写 if 判断简洁。PHP 8 之后也可用 array_multisort,但 usort 可读性更好。
六、去重排序常见坑
- array_unique 后忘记 array_values,导致 JSON 转成对象而非数组;
- 二维数组直接传 array_unique,比较的是数组句柄而不是字段;
- usort 回调返回非整数,排序结果不稳定;
- 大量数据排序时注意内存,不要在循环里反复排序整个数组。
七、总结
一维去重用 array_unique + array_values,二维按键去重用关联数组映射,按字段排序用 usort + 飞船运算符。理解索引数组与关联数组的键名保留规则,就能避开大部分数组处理坑。日常写业务代码优先用内置函数,性能和可读性都有保障。