如何为多维数组补全缺失键并将对应值设置为默认0
Laravel 时段统计数组补全缺失年份实现方案
核心思路是先提取所有需要展示的完整年份列表,再逐个时段比对补全缺失年份的y值为0,修改后的完整代码如下:
// 原有查询逻辑保持不变 $shipments = Orders::whereNotNull('shipped_at') ->groupBy(DB::raw('YEAR(created_at)')) ->selectRaw('count(*) as count, HOUR(shipped_at) as hour') ->selectRaw("DATE_FORMAT(created_at, '%Y') label") ->orderBy('label') ->orderBy('hour') ->groupBy('hour') ->get(); // 提取查询结果中所有出现过的年份,去重排序后得到完整年份列表 // 如果你需要固定年份范围,也可以直接手动赋值:$allYears = ['2019','2020','2021']; $allYears = $shipments->pluck('label')->unique()->sort()->values()->toArray(); $shipping_chart_year = []; foreach ($shipments as $item) { $hour = Carbon::parse($item['hour'] . ':00:00') ->timezone('America/Chicago') ->format('g:i A'); $shipping_chart_year[] = [ 'name' => $hour, 'data' => [['x' => $item['label'], 'y' => $item['count']]] ]; } $shipping_chart_year = collect($shipping_chart_year) ->groupBy('name') ->transform(function ($items, $name) use ($allYears) { // 将当前时段已有的统计数据转为 [年份 => 数值] 的关联数组,方便快速查找 $existData = $items->map(function ($item) { return $item['data'][0]; })->pluck('y', 'x')->toArray(); // 遍历完整年份列表,缺失的年份默认y值设为0 $data = []; foreach ($allYears as $year) { $data[] = [ 'x' => $year, 'y' => $existData[$year] ?? 0 ]; } return [ 'name' => $name, 'data' => $data, ]; }) ->values() ->toArray();
处理后得到的数组结构和要求的完全一致,所有时段的data数组都包含全部年份项,缺失项y值为0,且所有时段的data项顺序和年份排序保持一致。
内容的提问来源于stack exchange,提问作者AJK
相关产品推荐
相关产品推荐

