php数组去重后转json需分两步:先用array_unique()等函数去重(注意键名处理和完整键值对去重方法),再用json_encode($arr, json_unescaped_unicode)编码,否则中文会显示为\uxxxx;输入非法数据或未校验类型会导致返回null。

PHP数组去重后用 json_encode() 转JSON
直接调用 json_encode() 即可,但前提是先完成去重——PHP本身没有“去重+转JSON”一步到位的函数,必须分两步:先确保数据是去重后的数组(或对象),再编码。
常见错误是直接对含重复元素的数组(尤其是关联数组)调用 json_encode(),结果JSON里依然有重复项,误以为函数没生效。其实它只负责编码,不负责去重。
-
array_unique()适用于索引数组,但会重置键名(变成 0,1,2…),若需保留原键,加第二个参数SORT_REGULAR并配合array_values()或手动重建键 - 关联数组去重不能只靠
array_unique(),它默认只比较值,不比较键;若要按完整键值对去重,得用array_map('serialize', $arr)+array_unique()+array_map('unserialize', ...) - 去重前确认数据类型:如果源数据是 JSON 字符串,得先
json_decode($str, true)成 PHP 数组,处理完再json_encode()
遇到中文乱码?记得传 JSON_UNESCAPED_UNICODE
json_encode() 默认会把中文转成 \uXXXX 形式,看着像乱码,其实是标准行为。要输出可读中文,必须显式传标志位。
示例:
json_encode($deduped_array, JSON_UNESCAPED_UNICODE);
漏掉这个参数是线上最常被忽略的点——尤其在返回 API 给前端时,前端同学抱怨“字段名全是\u6570\u636e”,其实只是没加标志。
- PHP 5.4+ 才支持
JSON_UNESCAPED_UNICODE,老版本需自行替换或升级 - 如果还混用
JSON_PRETTY_PRINT,顺序无关,两个标志用|拼接即可 - 注意:该标志不影响键名是否转义,只针对字符串值中的 Unicode 字符
去重后 JSON 是 null?检查数据结构是否合法
json_encode() 返回 null 几乎一定是输入数据含不可序列化内容,和去重操作本身无关,但容易误判为去重逻辑出错。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
典型原因:
- 数组里混入了资源类型(如
fopen()返回的句柄) - 存在循环引用对象(对象 A 的属性指向对象 B,B 又指向 A)
- 用了
SimpleXML对象但没先json_encode(json_decode(json_encode($xml)))二次转换 -
array_unique()后没检查是否真返回了数组——比如传入空数组或非数组,可能返回false或null,直接喂给json_encode()就得null
安全做法:去重后加一层校验:
if (!is_array($deduped) || empty($deduped)) { /* 处理异常 */ }
性能敏感场景:别在大数组上反复 array_unique()
对上万条记录做 array_unique(),底层是哈希比对,时间复杂度 O(n),但内存占用明显上升——它会复制一份新数组。如果原始数据已从数据库查出,更推荐在 SQL 层去重:SELECT DISTINCT ... 或 GROUP BY。
实在要在 PHP 层做,且数据结构固定(如只去重某个字段),可用 array_column() 提取后再去重,比全量数组操作快不少:
$ids = array_column($data, 'user_id');<br>$unique_ids = array_unique($ids);
然后用 array_filter($data, fn($x) => in_array($x['user_id'], $unique_ids)) 回捞,比直接 array_unique($data) 更可控、更省内存。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










