Laravel查询生成多数组后如何合并为单个数组?已试array_merge无效
解决Laravel查询结果合并为
date => value数组的问题 嘿,我来帮你搞定这个问题!首先咱们得先搞清楚你当前代码的问题所在:你现在的循环是把每个记录包装成一个单元素的子数组(比如['Match' => '2024-01-01']),然后把这些子数组塞进$array里,最后得到的是一个包含多个小数组的大数组。这时候用array_merge()会因为每个子数组的键都是Match而被覆盖,array_push()只是继续添加子数组,自然达不到你想要的效果。
方案一:直接在循环中构建目标数组
最简单的方式就是在循环时直接给$array赋值键值对,而不是嵌套子数组:
$matchs = DiraChatLog::where('status','=','Match')->whereBetween('date_access', [$request->from, $request->to])->get(); $array = []; // 先初始化空数组 foreach ($matchs as $match) { // 把日期作为键,status作为值直接赋值 $array[$match->date_access] = $match->status; } dd($array);
这样生成的数组就是你想要的date => value结构,比如:
[ '2024-01-01' => 'Match', '2024-01-02' => 'Match', // ... 其他匹配的日期 ]
方案二:用Laravel集合的pluck()方法更优雅
既然你用的是Laravel,完全可以利用Eloquent集合的便捷方法一步到位,不需要手动循环:
$array = DiraChatLog::where('status','=','Match') ->whereBetween('date_access', [$request->from, $request->to]) ->pluck('status', 'date_access') // 第一个参数是值,第二个是键 ->toArray(); // 把集合转成普通数组 dd($array);
这个方法更简洁,Laravel会帮你自动处理键值映射,省去手动循环的代码。
注意:如果有多个记录对应同一个
date_access,后面的记录会覆盖前面的。如果需要处理重复日期的场景,可以根据需求调整(比如把值改成数组,收集所有对应的status)。
内容的提问来源于stack exchange,提问作者Rajveer Singh
相关产品推荐
相关产品推荐

