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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:03:25