php 8.1 中 json 解析后的二维数组去重分三类:完全结构去重用 array_unique+serialize;按指定字段去重用 array_column+array_flip+array_intersect_key;复合条件去重用循环归并。优先避免 implode 拼接,确保准确性。

PHP 8.1 中对 JSON 解析后的二维数组 去重,核心在于:JSON 解析结果是纯值数组(无资源、无闭包、键名规范),所以可安全使用序列化或严格比较方案,无需额外类型兜底。关键要区分两种常见需求——完全结构去重(所有键值顺序一致才算重复)和按指定字段去重(如只看 'id' 或 'email')。
完全结构去重:用 array_unique + serialize 最简洁
JSON 解析出的二维数组通常是关联数组或索引数组,元素结构干净,serialize 安全可靠。PHP 8.1 已优化序列化性能,该方法既简短又高效。
- 一行写法:
array_map('unserialize', array_unique(array_map('serialize', $data))) - 若需重置数字索引(去掉空洞),外层套
array_values() - 注意:子数组中不能含浮点数精度差异(如
1.0vs1),否则序列化后字符串不同,不会被识别为重复
按指定字段去重:用 array_column + array_keys 组合最高效
当你的 JSON 数据每项都有统一键(如 "user_id"、"email"),想以该字段为唯一依据保留最后/第一条记录,推荐此方式。它不依赖序列化,执行快,且天然支持“保留最新”逻辑。
- 提取字段值:
$ids = array_column($data, 'user_id'); - 构建唯一键映射:
$unique_map = array_flip(array_flip($ids));(自动覆盖重复键,保留最后出现项) - 还原原数组:
$result = array_intersect_key($data, $unique_map); - 若需保留最先出现项,改用
array_keys(array_unique($ids))再array_intersect_key
需要保留最新/最大值时:用复合键 + 循环归并
例如 JSON 数据含 ["url", "xyz", "updated_at"],要求相同 url+xyz 下只留 updated_at 最大的那条。这时不能简单去重,得归并筛选:
- 初始化空数组
$map = []; - 遍历每一项:
foreach ($data as $item) { $key = $item['url'] . '|' . $item['xyz']; if (!isset($map[$key]) || $item['updated_at'] > $map[$key]['updated_at']) { $map[$key] = $item; } } - 最终结果:
array_values($map) - 优势:逻辑清晰、可控性强,适合带业务规则的去重
兼容性提醒:避免 implode 拼接字符串去重
有些老教程建议用 implode(',', $sub) 转字符串再 array_unique,这在 JSON 解析后容易出错——比如字段含逗号、空格或数字字符串("123" 和 123 拼接后一样)。PHP 8.1 推荐坚持用 serialize 或字段提取,更准确稳定。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











