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

PHP实现CSV列遍历:统计指定年份低温天数函数开发问题

问题:实现统计指定年份气温≤给定温度的天数函数

我需要编写一个getDaysUnderTemp函数,接收年份和温度作为输入,返回指定年份中气温≤给定温度的天数。由于数据按小时记录,需统计符合条件的小时数再除以24。示例:getDaysUnderTemp(2019, -10)返回13.92。

CSV文件结构如下(year, month, day, hour, temperature):

2019,1,1,0,0.1
2019,1,1,1,0.4
2019,1,1,2,0.8
2019,1,1,3,1.3
2019,1,1,4,1.8
...
2020,1,1,0,-3.9

目前我的PHP代码如下(我是PHP新手):

function getDaysUnderTemp(int $targetYear, float $targetTemp): float {

    $inputFile = fopen("data/temperatures-debug.csv", "r");

    while (!feof($inputFile)) {

        $file = fgetcsv($inputFile);

        $hours = intval($file[3]);

        if (intval($file[0]) === $targetYear and floatval($file[4]) <= $targetTemp) {
            ???
            return ??? / 24;
        }

        fclose($inputFile);
    }
    return "error";
}

问题在于我不知道如何遍历指定年份的小时列,并将符合条件的小时数累加起来。


修复后的代码及解释

你的代码存在几个核心问题:循环内提前return导致无法统计全部符合条件的记录、文件过早关闭、返回值类型不匹配。下面是修复后的代码:

function getDaysUnderTemp(int $targetYear, float $targetTemp): float {
    // 初始化符合条件的小时数计数器
    $qualifiedHours = 0;
    $inputFile = fopen("data/temperatures-debug.csv", "r");

    // 检查文件是否成功打开,避免后续报错
    if (!$inputFile) {
        return 0.0;
    }

    // 逐行读取CSV数据,直到文件末尾
    while (($row = fgetcsv($inputFile)) !== false) {
        // 跳过格式不完整的行,防止数组越界
        if (count($row) < 5) {
            continue;
        }

        $year = intval($row[0]);
        $temp = floatval($row[4]);

        // 匹配目标年份且温度符合要求时,累加小时数
        if ($year === $targetYear && $temp <= $targetTemp) {
            $qualifiedHours++;
        }
    }

    // 循环结束后关闭文件,释放资源
    fclose($inputFile);

    // 将小时数转换为天数并返回
    return $qualifiedHours / 24;
}

关键说明

  • 计数器变量:新增$qualifiedHours用于累加符合条件的小时数,初始值设为0,每匹配一条记录就自增1。
  • 文件操作逻辑:fclose移到循环外部,确保所有行读取完成后再关闭文件;增加文件打开失败的判断,避免后续代码执行出错。
  • 循环逻辑:移除循环内的return,确保遍历完所有行后再计算最终结果;添加行格式检查,跳过空行或字段不足的行。
  • 返回值合规:始终返回float类型,符合函数声明的返回值要求,文件打开失败时返回0.0(可根据需求调整为其他合理值)。

内容的提问来源于stack exchange,提问作者fallguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:56