Laravel中如何按name字段对JSON数据的data键值进行分组聚合
Laravel按name字段分组合并data值实现方案
直接使用Laravel自带的集合(Collection)工具即可快速完成分组处理,以下是完整实现代码:
- 首先解码原始JSON数据,提取动物列表数组
// 替换为你实际的原始JSON字符串 $originalJson = '{"animals":[{"name":"Cumi-Cumi","data":1000},{"name":"Udang","data":300},{"name":"Baranang","data":12000},{"name":"Cumi-Cumi","data":1500},{"name":"Udang","data":500},{"name":"Baranang","data":17000},{"name":"Cumi-Cumi","data":2500}]}'; $originalData = json_decode($originalJson, true); $animalList = collect($originalData['animals']);
- 按name字段分组,重组每组的data数组
$processedAnimals = $animalList // 按name分组,如需统一name大小写可在分组时转换:groupBy(fn($i) => strtolower($i['name'])) ->groupBy('name') ->map(function ($itemGroup, $name) { return [ 'name' => $name, // 提取当前分组下所有data值组成数组 'data' => $itemGroup->pluck('data')->toArray() ]; }) // 重置索引,避免json编码时转为对象格式 ->values() ->toArray();
- 组装最终结构输出JSON
$result = [ 'animals' => $processedAnimals ]; // 输出格式化的JSON(线上环境可去掉JSON_PRETTY_PRINT参数) return response()->json($result, 200, [], JSON_PRETTY_PRINT);
注意事项
如果你的示例中需要将Udang转为小写udang,只需要修改groupBy和返回name的逻辑即可:
->groupBy(fn($item) => strtolower($item['name'])) ->map(function ($itemGroup, $lowerName) { return [ 'name' => $lowerName, 'data' => $itemGroup->pluck('data')->toArray() ]; })
内容的提问来源于stack exchange,提问作者SIFA
相关产品推荐
相关产品推荐

