直接用 array_unique($arr, sort_regular) 即可实现二维数组严格去重,php 7.2+ 原生支持,基于全等比较(===),保留键名与结构,重复项仅留首次出现者。

直接用 array_unique($arr, SORT_REGULAR) 就行。PHP 7.2 起这个函数原生支持二维数组的严格去重,能准确识别键名、键值、数据类型(比如 1 和 "1" 不算重复),同时保留原始键名和结构。
用 array_unique + SORT_REGULAR 原生去重
这是最简、最安全的方式,无需序列化或手动遍历:
- 比较逻辑是全等(
===),不是松散相等(==) - 子数组的键顺序、键名、值类型、嵌套结构全部参与判断
- 重复项中只保留第一次出现的那一个
- 键名不会被重置,如需连续数字索引可加
array_values()
示例:
$data = [
['name' => 'Alice', 'age' => 30],
['name' => 'Bob', 'age' => 25],
['name' => 'Alice', 'age' => 30], // 完全相同,会被剔除
['name' => 'alice', 'age' => 30], // name 大小写不同,视为不重复
];
$unique = array_unique($data, SORT_REGULAR);
$result = array_values($unique); // 可选:重置为 0,1,2...
避免踩坑的几个关键点
- 不要省略
SORT_REGULAR参数:缺省时默认SORT_STRING,会把所有子数组转成字符串再比,导致误判(例如['a'=>1]和['b'=>1]可能被当成一样) - 不要对含资源、闭包、匿名函数的数组用此方法:这些无法被
SORT_REGULAR安全比较,会报错或行为异常 - 如果数组里有浮点数且存在精度差异(如
0.1 + 0.2和0.3),建议先标准化(如round($val, 10))再调用,否则可能去不干净
其他方案只在特殊场景才考虑
-
需要按某几个字段去重(如只看
'id'和'email'):用array_column提取组合键 +array_flip去重 -
数据量极小、想完全避开序列化和函数依赖:手写
foreach+in_array($item, $unique, true)循环检查 - 数组含不可序列化内容,又必须严格比较结构:自定义递归比较函数,但性能明显下降
不复杂但容易忽略细节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











