PHP中fputcsv循环写入仅输出最后一行问题如何修复?
问题根因
只保留最后一行的核心原因是将输出文件的fopen操作放在了while循环内部:
fopen('packingresults.csv', 'w')中的w模式是「清空文件现有内容+从头写入」的截断写入模式- 每次循环都会重新打开文件、清空之前写入的所有内容,仅写入当前行的计算结果,最终自然只剩最后一次循环的内容
修复方案
只需要做以下调整即可:
- 把输出文件的
fopen操作移到while循环外部,和输入文件的打开逻辑平级 - 补充数组键名的引号(否则PHP会把未定义常量当作字符串触发Notice警告)
- 检查代码中未定义的
$perMin、$precentEff变量,提前完成赋值
修正后代码
<?php // 此处按实际业务赋值缺失的参数 $perMin = 1; $precentEff = 1; $sumArray = []; $sumArray1 = []; if (($handle = fopen("packing.csv", "r")) !== FALSE) { // 输出文件仅打开一次,放在循环外 $out = fopen('packingresults.csv', 'w'); if ($out === false) { die("输出文件打开失败,请检查目录读写权限"); } while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { // 数组键名加单引号避免语法警告 $empWroked = $data['Name']; $dateWroked = $data['Dated']; $startTime = $data['Start']; $endTime = $data['Finish']; $itemPacked = $data['Item']; $nameEmp = $data['Employee']; $startParts = explode(":", $startTime); $endParts = explode(":", $endTime); $startMinute = (int)$startParts[1]; $startHour = (int)$startParts[0]; $endMinute = (int)$endParts[1]; $endHour = (int)$endParts[0]; $differenceHour = ($endHour - $startHour); $differenceMinute = ($endMinute - $startMinute); $differenceHour -= (($differenceMinute < 0) ? 1 : 0); if ($differenceMinute < 0) $differenceMinute += 60; $difference = $differenceHour * 60 + $differenceMinute; if (!isset($sumArray1[$nameEmp])) { $sumArray1[$nameEmp] = 0; } if (!isset($sumArray[$nameEmp])) { $sumArray[$nameEmp] = 0; } $dataEff = [ $empWroked, $itemPacked, round(($perMin * ($sumArray[$nameEmp] += $itemPacked)) / ($sumArray1[$nameEmp] += $difference / $precentEff), 2) ]; fputcsv($out, $dataEff, ',', ' '); } fclose($handle); fclose($out); } ?>
内容的提问来源于stack exchange,提问作者stoperan
相关产品推荐
相关产品推荐

