Laravel 中按 SKU 键聚合关联数组并求和的完整实践

1次阅读

Laravel 中按 SKU 键聚合关联数组并求和的完整实践

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

text=ZqhQzanResources