
本文详解如何在 laravel(或原生 php)中对含重复 sku 的二维关联数组按 sku 键进行分组聚合,自动累加各列数值(如 qty、header1、header2),并生成去重合并后的结构化数据,适用于批量入库前的数据预处理。
本文详解如何在 laravel(或原生 php)中对含重复 sku 的二维关联数组按 sku 键进行分组聚合,自动累加各列数值(如 qty、header1、header2),并生成去重合并后的结构化数据,适用于批量入库前的数据预处理。
在实际业务场景中(如导入 Excel 库存数据、同步第三方 SKU 清单),常会遇到同一 SKU 多次出现、需合并其数量字段的情况。给定的 $data 是一个索引数组,其中每个子数组以 ‘0’ => ‘SKU-xxx’ 作为标识键,后续索引 ‘1’、’2’、’3′ 分别代表不同维度的数值(如 header1、header2、qty)。目标是:以 SKU 为分组键,对所有数值列执行求和,保留首行表头,并剔除重复 SKU 的原始条目。
以下为推荐的健壮实现方案(兼容 Laravel 项目,无需额外依赖,纯 PHP 数组操作):
// 原始数据(已去除表头行用于计算时可选,但此处保留以演示兼容性) $data = [ ['0' => 'SKU', '1' => 'header1', '2' => 'header2', '3' => 'qty'], ['0' => 'SKU-abc', '1' => 50, '2' => 0, '3' => 50], ['0' => 'SKU-pqr', '1' => 50, '2' => 0, '3' => 50], ['0' => 'SKU-abc', '1' => 0, '2' => 25, '3' => 25], ]; // 初始化结果容器:以 SKU 为键的关联数组 $aggregated = []; foreach ($data as $row) { $sku = $row['0']; // 跳过表头行(可选逻辑:若需保留表头且不参与计算) if ($sku === 'SKU') { $aggregated[$sku] = $row; continue; } // 若 SKU 已存在,则累加数值列('1', '2', '3');否则初始化 if (isset($aggregated[$sku])) { $aggregated[$sku]['1'] += $row['1']; $aggregated[$sku]['2'] += $row['2']; $aggregated[$sku]['3'] += $row['3']; } else { $aggregated[$sku] = $row; } } // 可选:转换为纯索引数组(便于后续 DB 插入或 API 返回) $result = array_values($aggregated); print_r($result);
✅ 输出结果:
Array ( [0] => Array ( [0] => SKU [1] => header1 [2] => header2 [3] => qty ) [1] => Array ( [0] => SKU-abc [1] => 50 [2] => 25 [3] => 75 ) [2] => Array ( [0] => SKU-pqr [1] => 50 [2] => 0 [3] => 50 ) )
⚠️ 关键注意事项
- 键安全性:确保 $row[‘0’] 始终存在且非空,生产环境建议添加 isset($row[‘0’]) && is_string($row[‘0’]) 校验;
- 数值类型强转:若源数据可能含字符串数字(如 “50”),应在累加前用 (int)$row[‘1’] 显式转换,避免字符串拼接;
- 扩展性优化:若列数动态变化(不止 4 列),可提取数值列索引(如 [‘1′,’2′,’3’])为配置项,用循环替代硬编码;
- Laravel 集成建议:可封装为 Collection 宏或服务类方法,例如:
collect($data)->groupBy(fn($item) => $item['0']) ->map(fn($group) => [ '0' => $group->first()['0'], '1' => $group->sum('1'), '2' => $group->sum('2'), '3' => $group->sum('3'), ])->values()->toArray(); - 数据库写入提示:聚合后使用 DB::table(‘inventory’)->upsert($result, [‘sku’], [‘header1’, ‘header2’, ‘qty’]); 实现幂等插入(Laravel 9+)。
该方案简洁高效,时间复杂度 O(n),无第三方依赖,可直接嵌入 Laravel 控制器、Job 或 Artisan 命令中,是处理 SKU 级数据聚合的通用范式。