删除JSON数组元素后JSON编码格式异常的解决请求
解决JSON数组删除元素后被序列化为对象的问题
这个问题的核心原因是:当PHP数组的数字索引不连续时,json_encode()会将其识别为关联数组,最终序列化为JSON对象(用{}包裹),而不是我们期望的JSON数组(用[]包裹)。
你用unset()删除数组中间元素后,$key1的索引变成了0和2(非连续),所以被转成了JSON对象。而删除最后一个元素时,索引还是0和1(连续),所以能正常输出JSON数组。
方案1:用array_values()重置数组索引
这是最直接的修复方式,只需要修改你代码中重新赋值key1的那一行,用array_values()把处理后的数组重新索引为连续的数字:
$json_str = '{"key1":["val11", "val12", "val13"], "key2":"val2"}'; $delete_keys = array("val12"); $json_arr = json_decode($json_str, true); $key1 = $json_arr['key1']; foreach ($delete_keys as $key) { $index = array_search($key, $key1); if ($index !== false) { // 这里建议用!==false判断,避免把索引0误判为不存在 unset($key1[$index]); } } // 关键修改:用array_values重置索引为连续数字 $json_arr['key1'] = array_values($key1); $json_str = json_encode($json_arr); print $json_str;
运行后就能得到你期望的结果:
{"key1":["val11","val13"],"key2":"val2"}
方案2:直接构建新数组(更高效直观)
如果不想处理索引问题,也可以直接遍历原数组,把不需要删除的元素放进新数组——新数组的索引天然是连续的,不需要额外处理:
$json_str = '{"key1":["val11", "val12", "val13"], "key2":"val2"}'; $delete_keys = array("val12"); $json_arr = json_decode($json_str, true); $new_key1 = []; foreach ($json_arr['key1'] as $val) { if (!in_array($val, $delete_keys)) { $new_key1[] = $val; } } $json_arr['key1'] = $new_key1; $json_str = json_encode($json_arr); print $json_str;
这种方法还能避免array_search带来的潜在性能问题(尤其是数组规模较大时),逻辑也更清晰。
补充说明:为什么删除最后一个元素没问题?
当你删除数组的最后一个元素时,剩下的元素索引是0和1,属于连续的数字序列,json_encode()会将其判定为索引数组,所以输出JSON数组格式。但删除中间元素后,索引变成非连续的,就会被当成关联数组处理,输出JSON对象。
内容的提问来源于stack exchange,提问作者user3248186
相关产品推荐
相关产品推荐

