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

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);

错误原因拆解

  1. array_splice参数错误:直接传入单个stdClass对象作为插入值,PHP会将对象的属性拆解成键值对插入数组,导致$decoded不再是纯对象数组,后续count()调用就会报错。
  2. 循环逻辑缺陷:从前往后循环时,插入元素会改变数组长度,导致循环索引错乱;同时原代码插入位置选在$i,会覆盖原位置元素,不符合“在3个元素后插入”的需求。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:40:42