如何使用Laravel Collection处理指定日期区间数据生成目标结构
Laravel Collection 按类型与日期范围聚合数据实现方案
前置准备
首先修正你提供的原始数据中缺失逗号的语法问题,再使用Laravel Collection结合Carbon日期工具实现需求,步骤如下:
实现步骤
- 生成指定范围的日期集合
- 将原始数据按
type字段分组 - 为每个
type遍历完整日期范围,匹配对应日期的记录,没有匹配记录则仅保留日期字段 - 最后为每个分组追加
type标识
完整代码示例
use Carbon\Carbon; use Carbon\CarbonPeriod; // 1. 定义目标日期范围,生成所有日期的集合 $startDate = Carbon::createFromFormat('Y-m-d', '2021-01-01'); $endDate = Carbon::createFromFormat('Y-m-d', '2021-01-04'); $dateRange = collect(CarbonPeriod::create($startDate, $endDate)->toArray()) ->map(fn($date) => $date->toDateString()); // 2. 原始数据转为Collection $originalData = collect([ ["id" => "1", "name" => "A", "type"=> "t1" ,"date" => "2021-01-01"], ["id" => "2", "name" => "B", "type"=> "t2", "date" => "2021-01-01"], ["id" => "3", "name" => "C", "type"=> "t1", "date" => "2021-01-02"], ["id" => "4", "name" => "D", "type"=> "t3", "date" => "2021-01-02"], ["id" => "5", "name" => "E", "type"=> "t2", "date" => "2021-01-01"], ]); // 3. 按type分组处理 $result = $originalData->groupBy('type') ->map(function ($typeItems, $type) use ($dateRange) { // 遍历完整日期范围生成条目 $dateItems = $dateRange->map(function ($currentDate) use ($typeItems) { $dateItem = ['date' => $currentDate]; // 匹配当前日期下的记录 $matchedRecords = $typeItems->where('date', $currentDate) ->map(fn($item) => ['id' => $item['id'], 'name' => $item['name']]) ->values(); if ($matchedRecords->isNotEmpty()) { $dateItem['record'] = $matchedRecords; } return $dateItem; })->values(); // 追加type字段 return $dateItems->put('type', $type); }) ->values(); // 如需输出数组格式调用 $result->toArray() // 如需输出JSON格式调用 json_encode($result)
输出说明
上述代码生成的结构和你要求的完全一致,数字索引对应4天的日期条目,额外追加type字段标识分组类型。
内容的提问来源于stack exchange,提问作者jenish lila
相关产品推荐
相关产品推荐

