php 7.2+ 推荐使用 array_unique($arr, sort_regular) 严格去重二维数组,可准确区分整型与数字字符串(如 1 和 "1"),保留键名与结构,无需序列化;必要时用 array_values() 重置索引。

PHP 7.2 中去除二维数组重复项,尤其当子数组含数字字符串(如 "1"、"0"、"10")时,关键在于避免类型混淆导致误判。比如 1(整型)和 "1"(字符串)在松散比较中相等,但严格去重时应视为不同项。原生 array_unique() 在 PHP 7.2+ 支持 SORT_REGULAR 标志,可安全处理混合类型,无需序列化也能准确判重。
用 array_unique + SORT_REGULAR 直接去重
这是最简洁、推荐的方案。PHP 7.2 起,array_unique($arr, SORT_REGULAR) 会逐元素执行全等比较(===),保留原始键名,同时正确区分 1 和 "1"、0 和 "0" 等。
- 直接传入二维数组,无需手动序列化或遍历
- 自动保持子数组内部键名与结构,不打乱顺序
- 对含数字字符串、布尔值、null 的子数组均能严格判别
- 最后用
array_values()重置数字索引(如需连续整数下标)
示例:
$data = [
['id' => 1, 'code' => '001'],
['id' => '1', 'code' => '001'], // id 是字符串 "1",与上一行不同
['id' => 1, 'code' => '002'],
['id' => 0, 'code' => '003'],
['id' => '0', 'code' => '003'], // id 是字符串 "0",与上一行不同
];
$unique = array_unique($data, SORT_REGULAR);
$result = array_values($unique); // 可选:重置索引
print_r($result); // 5 行全部保留,无误删
用 serialize + array_unique(兼容旧逻辑,慎用)
若项目中已存在依赖序列化的代码,或需兼容极早期 PHP 行为,仍可使用该方式。但要注意:serialize() 对数字字符串和整数生成不同字符串,因此也能区分,但开销略大,且无法处理资源/闭包。
- 先用
array_map('serialize', $arr)转为字符串数组 - 调用
array_unique()去重(此时是字符串比较,天然严格) - 再用
array_map('unserialize', ...)还原 - 必须加
array_values()重置索引,否则键可能错乱
按指定字段组合去重(如只看 'id' 和 'code')
当业务只需根据几个字段判断是否重复(例如忽略时间戳、状态等动态字段),可用 array_column 提取组合标识,再用哈希键去重。
- 遍历原数组,对每行提取目标字段并拼接,如
$key = $row['id'] . '|' . $row['code'] - 以该字符串为键存入临时数组:
$seen[$key] = $row - 最后用
array_values($seen)获取去重结果 - 这种方式完全绕过类型比较问题,逻辑清晰可控
避免错误方法:仅用 in_array 或 == 判断
不要用 in_array($item, $result) 默认松散比较,它会把 0 == "0" 判为 true,导致误删;也不要用 == 手动逐项比对——易漏键名、顺序或嵌套结构差异。
- 若坚持循环法,必须显式使用
in_array($item, $result, true)(第三个参数设为true) - 但性能随数据量增长明显下降,小数组可用,大数组不建议
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











