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

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

关键修改点说明

  1. 创建结果集合:新增$shippingResults数组用来存储每一次循环生成的配送数据,而不是一直复用同一个$shipping对象。
  2. 每次循环生成新对象:在循环内部创建新的$shipping实例,这样每个配送服务的数据都会独立保存,不会被后续循环覆盖。
  3. 避免不必要的累加:原代码中的$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:24:49