You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:40:31