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查询的数据,直接用模型关联预加载即可实现,不需要手动写循环处理:
- 首先在
Exchange模型中定义一对多关联:
public function exchangeLists() { return $this->hasMany(ExchangeList::class, 'exchange_id'); }
- 查询时直接用
with预加载关联数据:
$exchangeCheck = Exchange::with('exchangeLists')->get();
直接返回该查询结果即可自动输出你需要的结构,性能也比手动循环处理更好。
内容的提问来源于stack exchange,提问作者DevGe
相关产品推荐
相关产品推荐

