PHP中如何在对象数组每N个索引后添加对象及报错解决
解决PHP对象数组每3个元素后添加新对象的count()报错问题
问题场景
需要在PHP的对象数组中,每3个元素后插入一个新对象,编写代码后运行出现以下报错:
PHP Warning: count(): Parameter must be an array or an object that implements Countable.
已按照提示修复JSON格式无效问题,但报错仍存在。
原始代码
$mainArr = '[ {"name":"Saqib1", "id":"1"}, {"name":"Saqib2", "id":"2"}, {"name":"Saqib3", "id":"3"}, {"name":"Saqib4", "id":"4"}, {"name":"Saqib5", "id":"5"}, {"name":"Saqib6", "id":"6"}, {"name":"Saqib7", "id":"7"}, {"name":"Saqib8", "id":"8"}, {"name":"Saqib9", "id":"9"}, {"name":"Saqib10", "id":"10"} ]'; // Initial array of objects $newObject = new stdClass(); // The new object you want to add $newObject->name = 'New'; $newObject->id = '11'; $newObject->extraKey = 'this is extra key for newObjects to identify'; $n = 3; // The number of indexes after which to add the new object $decoded = json_decode($mainArr); for ($i = 0; $i < count($decoded); $i++) { if (($i + 1) % $n == 0) { array_splice($decoded, $i, 0, $newObject); } } print_r($mainArr);
错误原因拆解
array_splice参数错误:直接传入单个stdClass对象作为插入值,PHP会将对象的属性拆解成键值对插入数组,导致$decoded不再是纯对象数组,后续count()调用就会报错。- 循环逻辑缺陷:从前往后循环时,插入元素会改变数组长度,导致循环索引错乱;同时原代码插入位置选在
$i,会覆盖原位置元素,不符合“在3个元素后插入”的需求。 - 输出错误:最后打印的是原始JSON字符串
$mainArr,根本没输出处理后的数组。
修正后的代码
$mainArr = '[ {"name":"Saqib1", "id":"1"}, {"name":"Saqib2", "id":"2"}, {"name":"Saqib3", "id":"3"}, {"name":"Saqib4", "id":"4"}, {"name":"Saqib5", "id":"5"}, {"name":"Saqib6", "id":"6"}, {"name":"Saqib7", "id":"7"}, {"name":"Saqib8", "id":"8"}, {"name":"Saqib9", "id":"9"}, {"name":"Saqib10", "id":"10"} ]'; // 创建要插入的新对象 $newObject = new stdClass(); $newObject->name = 'New'; $newObject->id = '11'; $newObject->extraKey = 'this is extra key for newObjects to identify'; $n = 3; // 每3个元素后插入新对象 // 解码JSON为对象数组,先确认解码成功 $decoded = json_decode($mainArr); if (!is_array($decoded)) { die('JSON解码失败,请检查格式'); } // 从后往前循环,避免插入元素打乱索引顺序 for ($i = count($decoded) - 1; $i >= 0; $i--) { // 每3个元素后插入(索引+1是元素的第N个) if (($i + 1) % $n == 0) { // 用数组包裹新对象,确保插入的是完整对象 array_splice($decoded, $i + 1, 0, [$newObject]); } } // 输出处理后的对象数组 print_r($decoded); // 如需转回JSON格式,可使用下面的代码 // echo json_encode($decoded, JSON_PRETTY_PRINT);
关键修复说明
- 插入对象的正确方式:用
[$newObject]包裹单个对象,让array_splice插入完整的对象,而非拆解属性。 - 从后往前循环:避免插入元素后数组长度变化导致的索引偏移,无需额外调整循环变量,逻辑更稳定。
- 修正插入位置:改为
$i + 1,实现“在第3、6、9个元素之后插入”的需求,不会覆盖原元素。 - 增加解码校验:确保
json_decode返回的是数组,避免解码失败时触发count()报错。 - 输出处理后的数据:替换原代码的
print_r($mainArr),输出实际处理后的数组。
内容的提问来源于stack exchange,提问作者Najam Us Saqib
相关产品推荐
相关产品推荐

