PHP遍历多元素集合时仅返回最后一项的问题求助
解决foreach循环覆盖数据只返回最后一项的问题
你的问题核心在于每次循环都复用同一个$shipping对象,并且直接覆盖service属性的值,导致之前循环的数据被覆盖,最终只保留最后一次的结果。下面是具体的修改方案:
修改后的代码
// 初始化一个空数组,用来存储所有配送结果 $shippingResults = []; $result = $phpSigep->calcPrecoPrazo($params); foreach ($result->getResult() as $key => $shippingCorreios) { // 每次循环创建一个新的对象/数组,避免覆盖之前的数据 $shipping = new stdClass(); // 给当前配送服务赋值名称 $shipping->service = [ ['name' => $shippingCorreios->get('servico')->get('nome')] ]; // 按你的逻辑赋值金额(注意:如果这个金额是固定值,不需要累加,直接赋值即可) $shipping->amount = $productsToShipping['withRules']['amount']; // 将当前配送项加入结果数组 $shippingResults[] = $shipping; } // 查看所有结果 dd($shippingResults);
关键修改点说明
- 创建结果集合:新增
$shippingResults数组用来存储每一次循环生成的配送数据,而不是一直复用同一个$shipping对象。 - 每次循环生成新对象:在循环内部创建新的
$shipping实例,这样每个配送服务的数据都会独立保存,不会被后续循环覆盖。 - 避免不必要的累加:原代码中的
$shipping->amount += ...如果是针对固定金额的话,累加会导致金额越来越大,这里改成直接赋值(如果你的业务逻辑确实需要累加,请根据实际场景调整)。
如果你需要把所有服务名称收集到同一个service数组中(而不是每个项单独一个),可以调整为以下写法(前提是$shipping是全局初始化的对象):
// 初始化全局对象和空数组 $shipping = new stdClass(); $shipping->service = []; $shipping->amount = 0; $result = $phpSigep->calcPrecoPrazo($params); foreach ($result->getResult() as $key => $shippingCorreios) { // 追加服务名称到数组,而不是覆盖 $shipping->service[] = ['name' => $shippingCorreios->get('servico')->get('nome')]; // 如果需要累加金额,这里保留累加逻辑 $shipping->amount += $productsToShipping['withRules']['amount']; } dd($shipping);
这种写法会把所有服务名称放到同一个数组里,同时累加金额,适合需要汇总数据的场景。
内容的提问来源于stack exchange,提问作者domingos pires
相关产品推荐
相关产品推荐

