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

如何合并具有相同name值的数组并整合对应data数据

方案1:构建数组阶段直接聚合(推荐,性能最优)

不需要先生成重复的数组项再合并,在遍历$shipments的时候直接按格式化后的小时作为键聚合即可,代码如下:

$shipping_chart_year = [];
foreach ($shipments as $item) {
    $hour = Carbon::parse($item['hour'] . ':00:00')->timezone('America/Chicago')->format('g:i A');
    // 不存在该小时的分组则初始化
    if (!isset($shipping_chart_year[$hour])) {
        $shipping_chart_year[$hour] = [
            'name' => $hour,
            'data' => []
        ];
    }
    // 直接往对应分组的data里追加数据
    $shipping_chart_year[$hour]['data'][] = [
        'x' => $item['label'],
        'y' => $item['count']
    ];
}
// 重置数组键为数字索引,符合目标输出结构
$shipping_chart_year = array_values($shipping_chart_year);

方案2:对已生成的待合并数组做聚合

如果已经生成了原始的重复数组,可用以下两种方式完成合并:

方式A:使用Laravel集合(代码更简洁)

$merged = collect($shipping_chart_year)
    ->groupBy('name') // 按name字段分组
    ->map(function ($items) {
        return [
            'name' => $items->first()['name'],
            // 合并所有分组的data数组,仅展开一层保留x/y结构
            'data' => $items->pluck('data')->flatten(1)->toArray()
        ];
    })
    ->values() // 重置为数字索引数组
    ->toArray();

方式B:使用原生PHP

$merged = [];
foreach ($shipping_chart_year as $item) {
    $name = $item['name'];
    if (!isset($merged[$name])) {
        $merged[$name] = $item;
    } else {
        $merged[$name]['data'] = array_merge($merged[$name]['data'], $item['data']);
    }
}
$merged = array_values($merged);

额外优化提示

原SQL查询中两次调用groupBy,建议确认分组逻辑是否符合业务预期,可调整写法明确分组字段,避免ONLY_FULL_GROUP_BYSQL模式下的报错问题。

内容的提问来源于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:02