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

PHP使用unset删除数组元素后json_encode输出对象而非数组问题

问题成因

PHP中数组的数字索引不会因为unset()删除元素自动重置,也不会自动补全空缺的索引序号。
你的初始数组索引是0、1,用unset()删掉两个元素后,数组内部的索引游标仍然停留在2的位置,后续用$array[]语法追加元素时,会从2开始分配新的键名,最终数组的键是2、3,不属于从0开始连续递增的数字索引数组。
而json_encode()的编码规则是:只有键名从0开始、连续无中断的数字索引数组,才会被编码为JSON数组格式;只要数字索引不连续、或者存在非数字键,就会被编码为JSON键值对对象结构,这就是你得到{"2":{"name":"mario"},"3":{"name":"hector"}}输出的原因。

修复方案

根据你的使用场景选对应方法即可:

  • 如果你需要清空原数组所有内容再追加新值:直接重置数组变量,不要逐个unset元素,索引会自动归零
$array = [['name' => "pepe"], ['name' => 'marta']];
$array = []; // 直接赋值空数组清空,重置索引
$array[] = ['name' => 'mario'];
$array[] = ['name' => 'hector'];
echo json_encode($array);
  • 如果你只是删除部分元素、保留剩余内容后再追加:追加完成后用array_values()函数重建连续索引
$array = [['name' => "pepe"], ['name' => 'marta']];
unset($array[0]);
unset($array[1]);
$array[] = ['name' => 'mario'];
$array[] = ['name' => 'hector'];
// 取出所有元素值,重新生成从0开始的连续索引
$array = array_values($array);
echo json_encode($array);
  • 如果你是删除数组中某段连续的元素:可以用array_splice()代替unset(),该函数删除元素后会自动重建连续数字索引
$array = [['name' => "pepe"], ['name' => 'marta']];
// 从索引0位置开始,删除2个元素,自动重建索引
array_splice($array, 0, 2);
$array[] = ['name' => 'mario'];
$array[] = ['name' => 'hector'];
echo json_encode($array);

注意:不要误用JSON_FORCE_OBJECT参数,该参数作用是强制将所有数组编码为对象,和你期望得到标准JSON数组的需求完全相反。

内容的提问来源于stack exchange,提问作者MAximy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:33:43