PHP循环生成CSV文件异常:如何修复跳过子数组的问题?
解决CSV生成遗漏子数组的问题
嗨,我来帮你搞定这个问题!你的代码现在只生成了第一个子数组的CSV文件,核心原因是额外加的$CurrentArmazem条件判断限制了只有第一次循环会执行写入逻辑,后续循环只是更新了$CurrentArmazem却完全没处理数据和生成文件的步骤。
其实完全可以简化这个逻辑,直接遍历$StockReady里的每一个子数组,逐个生成对应的CSV文件,不需要那些多余的判断。修改后的代码如下:
$dir = "你的目标目录路径"; // 记得替换成实际的目录路径 foreach ($StockReady as $CodArmazem => $line) { $FileName = $CodArmazem . '.csv'; $Stocks = ''; // 每次循环重置拼接字符串,避免不同子数组的数据混在一起 foreach ($line as $value) { $Stocks .= $value[0] . "\n"; // 加上换行,确保每条数据单独占一行,符合CSV格式 } $doc = $dir . $FileName; $myfile = fopen($doc, "w"); fwrite($myfile, $Stocks); fclose($myfile); }
代码说明:
- 去掉了冗余的
reset($CurrentArmazem)、key($CurrentArmazem)以及条件判断,直接遍历整个$StockReady数组 - 每次循环重置
$Stocks变量,防止不同子数组的数据互相污染 - 拼接数据时添加换行符,保证CSV文件的格式可读性
- 保持了每个子数组对应一个以键名为文件名的CSV文件的需求
如果一定要基于你原来的代码结构修改else块(虽然不推荐,因为逻辑冗余),可以把处理数据和写入文件的逻辑复制到else中,修改后的代码如下:
$CurrentArmazem = $StockReady; reset($CurrentArmazem); $CurrentArmazem = key($CurrentArmazem); foreach ($StockReady as $CodArmazem => $line) { $FileName = $CodArmazem . '.csv'; if ($CurrentArmazem === $CodArmazem) { $Stocks = ''; foreach ($line as $value) { $Stocks .= $value[0] . "\n"; } $doc = $dir . $FileName; $myfile = fopen($doc, "w"); fwrite($myfile, $Stocks); fclose($myfile); } else { $CurrentArmazem = $CodArmazem; // 复制处理逻辑到else块 $Stocks = ''; foreach ($line as $value) { $Stocks .= $value[0] . "\n"; } $doc = $dir . $FileName; $myfile = fopen($doc, "w"); fwrite($myfile, $Stocks); fclose($myfile); } }
显然第一种重构后的代码更简洁、易维护,也不会出现逻辑漏洞。
内容的提问来源于stack exchange,提问作者Alexis Garcia
相关产品推荐
相关产品推荐

