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
相关产品推荐
相关产品推荐

