在Laravel 10/PHP 8.2中使用collapse合并数组失败,如何正确收集循环查询数据到单个数组?
在Laravel 10/PHP 8.2中使用collapse合并数组失败,如何正确收集循环查询数据到单个数组?
我来帮你分析下问题出在哪,以及怎么解决~
你现在用Arr::collapse()的方式不对哦,这个方法要求传入一个包含多个数组的数组,但你每次调用时把当前的$data和新查询到的数组作为两个独立参数传进去,这不符合它的参数规则,所以才会合并失败,最后得到空数组。
给你几个正确的实现方式,你可以根据需求选:
方法一:先攒数组再一次性合并
先把每次查询的结果数组都放到一个大数组里,最后用Arr::collapse()合并成一维数组:$data = []; foreach ($yourParameterList as $someParameter) { // 把每次的查询结果数组添加到大数组中 $data[] = $query->where('some_field', $someParameter)->get()->toArray(); } // 最后一次性合并所有子数组 $finalData = Arr::collapse($data);方法二:循环中直接合并数组
用array_merge()每次把新数据合并到已有数组里,写法更直接:$data = []; foreach ($yourParameterList as $someParameter) { $newItems = $query->where('some_field', $someParameter)->get()->toArray(); $data = array_merge($data, $newItems); } // 此时$data就是合并后的一维数组方法三:用Laravel集合的concat方法(更优雅)
利用Laravel集合的链式操作,每次追加查询结果集合,最后转成数组:$resultCollection = collect(); foreach ($yourParameterList as $someParameter) { $resultCollection = $resultCollection->concat($query->where('some_field', $someParameter)->get()); } $finalData = $resultCollection->toArray();
另外还要提个优化点:如果你的这些$someParameter是一个数组的话,完全可以不用循环查询,直接用whereIn来一次查询出所有数据,性能会好很多,比如:
// 假设$yourParameters是包含所有参数的数组 $finalData = $query->whereIn('some_field', $yourParameters)->get()->toArray();
备注:内容来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

