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

如何为多维数组补全缺失键并将对应值设置为默认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:07