PHP中如何正确合并JSON对象?多次执行出现嵌套数组问题
问题描述
我尝试合并JSON数组,一个从use.json文件读取,另一个由变量值生成。执行以下代码:
$b = json_encode(array("ID"=>$userid, "Username"=>$Username, "Account"=>$Account)); $filedata = file_get_contents("use.json",true); $a = $filedata; $user[] = json_decode($a, true); $user[] = json_decode($b, true); $json_merge = json_encode($user); file_put_contents("use.json",$json_merge);
首次执行添加user1和user2时结果正确:
[{"ID":"1","Username":"user1","Account":"123"},{"ID":"2","Username":"user2","Account":"1234"}]
但再次执行添加user3时,原有数组被嵌套,新用户成为第三个元素:
[[{"ID":"1","Username":"user1","Account":"123"},{"ID":"2","Username":"user2","Account":"1234"}],{"ID":"3","Username":"user3","Account":"12345"}]
我期望得到包含三个JSON对象的一维数组:
[{"ID":"1","Username":"user1","Account":"123"},{"ID":"2","Username":"user2","Account":"1234"},{"ID":"3","Username":"user3","Account":"12345"}]
请问问题出在哪里?如何正确合并JSON对象?
问题原因
核心问题是错误地将文件中读取的一维数组作为单个元素添加到新数组中:
- 当第二次执行代码时,
use.json中已经存储了一个一维JSON数组,json_decode($a, true)会将其解析为PHP的一维数组。但你用$user[] = ...把这个一维数组作为$user数组的第一个元素,再把新用户数组作为第二个元素,最终导致数组嵌套。
解决方法
正确的逻辑是:将文件中读取的JSON数组直接赋值给$user,再把新用户对象追加到这个数组末尾,同时处理文件为空的初始情况。
修正后的代码:
// 直接生成新用户的PHP数组,无需先转JSON再解码,提升效率 $newUser = array("ID"=>$userid, "Username"=>$Username, "Account"=>$Account); // 读取文件内容 $filedata = file_get_contents("use.json", true); // 解码JSON为PHP数组,若文件为空则初始化为空数组 $user = json_decode($filedata, true) ?: []; // 将新用户追加到数组末尾 $user[] = $newUser; // 编码为JSON并写入文件 $json_merge = json_encode($user); file_put_contents("use.json", $json_merge);
关键改进点:
- 避免多余的JSON编解码:直接操作PHP数组,减少不必要的性能损耗。
- 兼容初始空文件场景:使用
?: []确保$user始终为数组类型,避免json_decode返回null导致的错误。 - 正确追加元素:
$user[] = $newUser是将新用户对象作为元素添加到原有数组末尾,而非把原有数组嵌套进新数组。
内容的提问来源于stack exchange,提问作者Arad
相关产品推荐
相关产品推荐

