
本文详解如何在 Laravel 中将 JSON 数据解析为 PHP 数组后,利用 Collection 的 mapToGroups 方法高效构建「公司 → 部门名称数组」结构的自定义集合,避免冗余字段并实现精准分组。
本文详解如何在 laravel 中将 json 数据解析为 php 数组后,利用 collection 的 `maptogroups` 方法高效构建「公司 → 部门名称数组」结构的自定义集合,避免冗余字段并实现精准分组。
在 Laravel 开发中,常需将原始数据(如 JSON 文件或 API 响应)转换为结构清晰、便于后续操作的集合(Collection)。本例目标是:将扁平的员工/部门 JSON 列表,按 company 字段分组,并使每个公司对应一个去重后的纯部门名称数组(字符串列表),而非包含完整对象的嵌套结构。
原始 JSON 解析为 PHP 数组后(假设变量为 $jsonData),直接使用 collect($jsonData)->groupBy('company') 会保留每条记录的全部字段;而 map()->unique()->groupBy() 组合虽能去重,仍需额外提取 department 字段——代码冗长且易出错。
✅ 推荐解法:使用 Laravel Collection 内置的 mapToGroups 方法,它专为“一对多映射 + 分组”场景设计,语义清晰、性能优异:
// 假设 $jsonData 是原始 JSON 字符串(如 file_get_contents('data.json'))
$dataCollection = collect(json_decode($jsonData, false))
->mapToGroups(function ($item) {
return [$item->company => $item->department];
})
->map(function ($departments) {
return $departments->unique()->values()->all();
})
->toArray();
? 关键说明:
- json_decode($jsonData, false) 第二个参数设为 false,确保返回 stdClass 对象(JSON 键名小写,如 "company" 而非 "Company",注意字段名大小写一致性);
- mapToGroups 接收回调函数,该函数必须返回一个关联数组:键为分组依据(此处是 $item->company),值为要归入该组的元素(此处是 $item->department 字符串);
- 后续链式调用 .map(...)->unique()->values()->all() 确保每个公司的部门列表自动去重、重索引(避免空键),最终转为纯 PHP 数组供视图或 API 使用。
? 进阶提示:若原始数据中 company 或 department 可能为 null,建议前置过滤:
->filter(fn($item) => !empty($item->company) && !empty($item->department))
最终输出结构完全符合需求:
[ "Company 1" => ["Department 1", "Department 2"], "Company 2" => ["Department 1", "Department 2"], "Company 3" => ["Department 1", "Department 2"] ]
此方案简洁、可读性强,充分利用 Laravel Collection 的函数式特性,无需手动遍历或 foreach,是处理此类分组映射任务的最佳实践。











