如何合并具有相同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
相关产品推荐
相关产品推荐

