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

数组转换后跨组重复产品值仍同步变更问题求助

问题原因与解决方案

核心问题

你遇到的问题本质是数组嵌套层级的引用传递。Laravel的toArray()方法虽然将集合转为数组,但嵌套的关联数据(比如重复的产品对象)在转数组后仍可能共享内存引用,导致修改一个分组内的产品值时,其他分组的相同产品同步变更。

解决方法

通过深度复制数组打破引用关联,最简便的方式是利用JSON序列化再反序列化,生成完全独立的数组副本:

$array = GroupProduct::where('status', 1)
    ->with(['groupProductProduct.product' => function($query) use ($id) {
        $query->where('products.situation', 1)
            ->with(['items.orderitems' => function($query2) use ($id) {
                $query2->where('order_items.order_id', $id)->with('subitems');
            }]);
    }])
    ->get()
    ->toArray();

// 深度复制数组,彻底切断引用
$groups = json_decode(json_encode($array), true);

// 后续循环逻辑调整(添加引用确保修改生效)
foreach ($groups as $key => &$groupProduct) {
    foreach ($groupProduct['group_product_product'] as $key2 => &$groupProductProduct) {
        if(isset($groupProductProduct['product'])){
            foreach ($groupProductProduct['product']['items'] as $key3 => &$productItems) {
                $orderItems = $productItems['orderitems'] ?? [];
                
                if(!empty($orderItems['subitems'])){
                    foreach ($orderItems['subitems'] as $subItem) {
                        if($orderItems['group_product_id'] === $groupProduct['id'] && $subItem['product_item_id'] === $productItems['id']){             
                            $productItems['subitems'] = $subItem;
                            $productItems['unit_value'] = $subItem['unit_value'];
                            $productItems['total_value'] = $subItem['total_value'];
                            $productItems['qtdfnc'] = $subItem['unit_value'] / $groupProductProduct['product']['factor'];
                        }
                    }
                }
                
                unset($productItems['orderitems']);      
            }
            unset($productItems);
        }
        unset($groupProductProduct);
    }
    unset($groupProduct);
}

额外优化说明

  • 循环中使用&引用数组元素,确保修改能直接作用于$groups原数组(原代码未使用引用时,修改的只是循环临时变量,无法同步到目标数组)
  • 用?? []和!empty()替代单一isset()判断,避免空值引发的PHP警告
  • 循环结束后手动释放引用,防止后续代码意外篡改数组内容

内容的提问来源于stack exchange,提问作者gobs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:32:42