Laravel中如何对集合数据分组并格式化为指定响应结构?
问题说明
初始集合数据
$collection = collect( [ ["md_id" => 1, "hs_id" => 1234], ["md_id" => 2, "hs_id" => 5432], ["md_id" => 3, "hs_id" => 1234], ] );
预期目标
对上述Laravel集合做分组,不要返回以分组字段作为键名的关联结构,最终输出带自定义属性的结构,格式如下:
{ "data" : [ { "hs_id": 1234, "type" : "pt", "group_data": [ {"md_id" : 1}, {"md_id" : 3} ] }, { "hs_id": 5432, "type" : "kl", "group_data": [ {"md_id" : 2} ] } ] }
当前写法问题
现有实现代码:
$data = $mds->groupBy("hs_id"); return response()->json(compact("data"));
该写法返回结果是以hs_id为外层键的关联数组,不符合预期的索引数组输出要求。
实现代码
在groupBy基础上通过map重构分组项结构,最后调用values()重置外层键即可,完整代码如下:
$data = $collection->groupBy('hs_id') ->map(function ($groupItems, $hsId) { // type字段可根据实际业务规则替换赋值逻辑,此处为匹配示例结果的简单判断 $type = $hsId == 1234 ? 'pt' : 'kl'; return [ 'hs_id' => $hsId, 'type' => $type, // 提取分组内条目的md_id字段组成group_data 'group_data' => $groupItems->map(fn($item) => ['md_id' => $item['md_id']])->values() ]; }) ->values(); // 重置外层键,移除原hs_id键名,转为连续数字索引的数组 return response()->json(compact('data'));
逻辑说明
- 第一步调用
groupBy('hs_id')完成基础分组,得到以hs_id为键的分组集合 - 第二步通过
map遍历每个分组,组装需要的hs_id、自定义type字段,同时过滤分组内条目,仅保留md_id字段存入group_data - 最后调用
values()重置外层集合的键,将原本以hs_id为键的关联结构转为顺序索引数组,输出时就会匹配预期格式,不会出现hs_id作为外层键的情况
内容的提问来源于stack exchange,提问作者jp.palubs
相关产品推荐
相关产品推荐

