PHP实现CSV按列分组并合并同组其他列值的方法问询
解决CSV同商品多记录合并问题
核心思路是通过唯一标识分组(ArtNo+Name),将同商品的不同属性值收集后合并为逗号分隔的字符串,具体实现步骤如下:
1. 读取CSV并初始化合并容器
先把CSV内容读取为关联数组(方便按字段名操作),同时创建一个空数组用于存放合并后的商品数据,用ArtNo|Name作为唯一键确保同商品归为一组。
// 读取CSV文件 $csvFile = 'your_products.csv'; $handle = fopen($csvFile, 'r'); if (!$handle) { die('无法打开CSV文件'); } // 获取表头,转成关联数组 $headers = fgetcsv($handle); $rawData = []; while (($row = fgetcsv($handle)) !== false) { $rawData[] = array_combine($headers, $row); } fclose($handle); // 初始化合并数组 $mergedProducts = [];
2. 遍历原始数据,分组合并属性
遍历每条原始记录,根据唯一键判断商品是否已存在:
- 首次出现:直接存入合并数组,将需要合并的字段(Color、Size)初始化为数组
- 重复出现:将对应属性值追加到已有记录的数组中
foreach ($rawData as $item) { // 生成唯一分组键(可根据实际情况调整,比如ArtNo唯一的话只用ArtNo) $groupKey = $item['ArtNo'] . '|' . $item['Name']; if (!isset($mergedProducts[$groupKey])) { // 初始化新商品记录 $mergedProducts[$groupKey] = [ 'ArtNo' => $item['ArtNo'], 'Name' => $item['Name'], 'Color' => [$item['Color']], 'Size' => [$item['Size']], // 复制其他不需要合并的字段 'Price' => $item['Price'], 'Stock' => $item['Stock'] ]; } else { // 追加属性值到数组 $mergedProducts[$groupKey]['Color'][] = $item['Color']; $mergedProducts[$groupKey]['Size'][] = $item['Size']; // 其他需要合并的字段同理追加 } }
3. 转换合并后的属性为逗号分隔字符串
遍历合并数组,将存放在数组中的属性值去重(可选)后,用逗号拼接成字符串。
// 处理属性数组为逗号分隔字符串 foreach ($mergedProducts as &$product) { // 去重+拼接,不需要去重可去掉array_unique $product['Color'] = implode(', ', array_unique($product['Color'])); $product['Size'] = implode(', ', array_unique($product['Size'])); } unset($product); // 释放引用
4. 替换原有逻辑使用合并后的数据
现在$mergedProducts就是合并后的商品数组,直接替换原有脚本中生成HTML表格的数据源即可,后续生成PDF的流程无需修改。
关键点说明
- 唯一键的生成:如果
ArtNo本身是全局唯一的,可以简化为$groupKey = $item['ArtNo'],无需拼接Name - 去重处理:
array_unique用于避免CSV中同商品同属性的重复记录,若确定无重复可省略 - 扩展支持:如果还有其他需要合并的字段(如
Material),只需在初始化和追加步骤中添加对应字段即可
内容的提问来源于stack exchange,提问作者Dreshar
相关产品推荐
相关产品推荐

