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

Laravel环境下PHP向数组推送对象时如何避免exchange对象重复?

解决方案

首先需要纠正一个格式问题:你预期的返回结构不符合JSON规范,同一个对象下不允许出现重复的exchange_list键,正确的格式应该把同id的所有关联数据放在数组类型的exchange_lists字段中,返回结构如下:

[
    {
        "exchange": {
            "id": 1,
            "branch": "BB1",
            "old_check_no": "0001",
            "cash": "250000",
            "bank_deposit": "1000000",
            "offset": "250000",
            "amount": "10000",
            "over_under": null,
            "checkDate": "2021-09-11",
            "remarks": "1",
            "date_closed": "2021-09-11"
        },
        "exchange_lists": [
            {
                "exchange_id": 1,
                "new_check_no": "001",
                "new_check_bank": "bank",
                "new_check_branch": "Lagros"
            },
            {
                "exchange_id": 1,
                "new_check_no": "002",
                "new_check_bank": "bank",
                "new_check_branch": "Lagros"
            }
        ]
    }
]

循环逻辑修改方案

你可以用exchange的id作为临时索引避免重复条目,修改后的代码如下:

$myArray = [];
foreach($exchange_check as $primary_array) {
    // 用id做键,避免同一个exchange重复创建条目
    if (!isset($myArray[$primary_array->id])) {
        $myArray[$primary_array->id] = (object)[
            'exchange' => $primary_array,
            'exchange_lists' => [] // 初始化空数组存储关联明细
        ];
    }
    // 匹配到的明细直接推入对应exchange的数组中
    foreach($exchange_lists as $second_array) {
        if($second_array->exchange_id == $primary_array->id) {
            $myArray[$primary_array->id]->exchange_lists[] = $second_array;
        }
    }
}
// 如果需要重置为普通数字索引数组,额外执行下面一行
$myArray = array_values($myArray);

如果处理的数据量较大,还可以先对$exchange_lists做分组预处理,避免嵌套循环重复遍历,效率更高:

// 先把明细按exchange_id分组
$groupedLists = collect($exchange_lists)->groupBy('exchange_id');
$myArray = [];
foreach ($exchange_check as $primary_array) {
    $myArray[] = (object)[
        'exchange' => $primary_array,
        'exchange_lists' => $groupedLists->get($primary_array->id, collect())->all()
    ];
}

Laravel更优方案(推荐)

如果你是用Laravel ORM查询的数据,直接用模型关联预加载即可实现,不需要手动写循环处理:

  1. 首先在Exchange模型中定义一对多关联:
public function exchangeLists()
{
    return $this->hasMany(ExchangeList::class, 'exchange_id');
}
  1. 查询时直接用with预加载关联数据:
$exchangeCheck = Exchange::with('exchangeLists')->get();

直接返回该查询结果即可自动输出你需要的结构,性能也比手动循环处理更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:06:04