PHP统计数组相同ID行数并递增对应字段导出CSV
嘿,我完全懂你这个头疼的问题——给同一ID的行按顺序加行号,确实得先做好分组统计再处理对吧?咱们直接来改你的脚本就行!
具体解决方案
核心思路是先统计每个ID对应的总行数,然后在遍历写入CSV的时候,给每个ID维护一个递增的计数器,这样就能生成对应的行号了。
1. 先统计每个ID的总行数
在正式写入CSV之前,先遍历一遍你的数据集,把每个ID出现的次数记下来:
// 初始化一个数组,用来存每个ID对应的总行数 $idRowCounts = []; foreach ($object as $item) { // 这里一定要替换成你实际数据里的ID字段!比如$item['product_id'] $id = $item['id']; $idRowCounts[$id] = isset($idRowCounts[$id]) ? $idRowCounts[$id] + 1 : 1; }
2. 遍历写入时维护行号计数器
接下来在写入CSV的循环里,给每个ID维护一个当前的行号计数器,每次遇到同一个ID就递增,然后把行号加到你的数据里:
// 初始化当前ID的行号计数器 $currentIdCounters = []; foreach ($object as $item) { $id = $item['id']; // 同样替换成实际ID字段 // 如果是第一次遇到这个ID,初始化计数器为0 if (!isset($currentIdCounters[$id])) { $currentIdCounters[$id] = 0; } $currentIdCounters[$id]++; // 生成行号,你可以自定义格式: // 比如"当前行/总行"的格式: $rowNumber = "{$currentIdCounters[$id]}/{$idRowCounts[$id]}"; // 或者只需要递增的序号: // $rowNumber = $currentIdCounters[$id]; // 把行号加到当前数据项里(确保$allexportfields包含对应的字段,比如'row_number') $item['row_number'] = $rowNumber; // 接下来是你原有的组装CSV行逻辑 $rowData = []; foreach ($allexportfields as $field) { // 兼容字段不存在的情况,避免报错 $rowData[] = $item[$field] ?? ''; } // 写入CSV行 fputcsv($file, $rowData); }
3. 整合后的完整函数
把上面的逻辑整合到你的原函数里,最终代码大概是这样:
public function fputToFile($file, $allexportfields, $object, $ae) { if($allexportfields && $file && $object && $ae) { // 第一步:统计每个ID的总行数 $idRowCounts = []; foreach ($object as $item) { // 替换成你实际的ID字段! $id = $item['id']; $idRowCounts[$id] = isset($idRowCounts[$id]) ? $idRowCounts[$id] + 1 : 1; } // 第二步:初始化当前ID的行号计数器 $currentIdCounters = []; // 遍历每个要导出的项 foreach ($object as $item) { $id = $item['id']; // 替换成实际ID字段 // 更新当前ID的行号 if (!isset($currentIdCounters[$id])) { $currentIdCounters[$id] = 0; } $currentIdCounters[$id]++; // 生成自定义格式的行号 $rowNumber = "{$currentIdCounters[$id]}/{$idRowCounts[$id]}"; // 若只需序号,改用:$rowNumber = $currentIdCounters[$id]; // 将行号加入到当前数据项 $item['row_number'] = $rowNumber; // 组装CSV行数据 $rowData = []; foreach ($allexportfields as $field) { $rowData[] = $item[$field] ?? ''; } // 写入CSV文件 fputcsv($file, $rowData); } } }
几个要注意的点
- 替换ID字段:一定要把代码里的
$item['id']换成你实际数据中的ID字段,比如$item['order_id']或者$item['sku_id'],不然统计会出错。 - 行号格式:根据你的需求调整行号格式,是要“1/3”这种带总行数的,还是单纯的“1、2、3”序号,改
$rowNumber的赋值逻辑就行。 - 字段兼容性:确保
$allexportfields数组里包含你要输出的行号字段(比如'row_number'),不然行号不会出现在最终的CSV里。如果不想修改$allexportfields,也可以直接把行号追加到$rowData数组的开头或结尾。
内容的提问来源于stack exchange,提问作者Dario Filidei
相关产品推荐
相关产品推荐

