You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中fputcsv循环写入仅输出最后一行问题如何修复?

问题根因

只保留最后一行的核心原因是将输出文件的fopen操作放在了while循环内部:

  • fopen('packingresults.csv', 'w') 中的w模式是「清空文件现有内容+从头写入」的截断写入模式
  • 每次循环都会重新打开文件、清空之前写入的所有内容,仅写入当前行的计算结果,最终自然只剩最后一次循环的内容

修复方案

只需要做以下调整即可:

  1. 把输出文件的fopen操作移到while循环外部,和输入文件的打开逻辑平级
  2. 补充数组键名的引号(否则PHP会把未定义常量当作字符串触发Notice警告)
  3. 检查代码中未定义的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:42:04