PHP数组去重array_unique与多维数组处理 PHP
前言
一维数组去重直接用 array_unique,但多维数组(如查询结果行)直接调用会报错或按序列化比较失效。很多人在处理列表、标签去重时踩这个坑。本文讲解一维去重、按指定键去重、保留首次出现、多维数组的正确写法。
操作步骤
1. 一维数组去重
$arr = [1,2,2,3,3,3];
$unique = array_unique($arr);
返回保留首次出现的结果,注意键名不重排。
2. 重置键名
$unique = array_values(array_unique($arr));
3. 按关联数组某个键去重(多维)
$rows = [
['id'=>1,'name'=>'a'],
['id'=>2,'name'=>'b'],
['id'=>1,'name'=>'a'],
];
$seen = [];
$result = array_filter($rows, function($row) use (&$seen){
$key = $row['id'];
if (isset($seen[$key])) return false;
$seen[$key] = true;
return true;
});
$result = array_values($result);
4. 标签字符串去重
$tags = ['php','mysql','php','nginx'];
$tags = array_values(array_unique($tags));
5. 不区分大小写去重
$lower = array_unique(array_map('strtolower', $arr));
常见坑
- array_unique 对多维数组按序列化比较,结果不符合预期。
- 去重后键名保留原索引,foreach 或 JSON 输出可能出现空洞。
- 数字和字符串被当作不同值,严格比较需注意。
- 浮点数直接比较可能因精度重复判断失误。
- 大数组遍历去重性能差,先用键做映射更快。
- 关联数组按值去重要选唯一业务键,不能用整个行比较。
- 去重顺序依赖首次出现位置,不要假设排序。
总结
一维用 array_unique + array_values 重置键;多维用辅助数组按业务键标记去重。比较前统一大小写和类型,大数组优先用键映射。理解 array_unique 按值比较的特性,多维场景自己实现才不会出错。
遇到问题加QQ23979811 协助处理
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 + 飞船运算符。理解索引数组与关联数组的键名保留规则,就能避开大部分数组处理坑。日常写业务代码优先用内置函数,性能和可读性都有保障。