
本文详解如何在 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 级数据聚合的通用范式。










