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
相关产品推荐
相关产品推荐

