PHP实现:根据目标温度生成年度低温天数字典函数
实现getDaysUnderTempDictionary函数的两种方案
现有getDaysUnderTemp函数可计算单一年份内气温≤目标温度的天数,现在要实现一个函数,返回所有年份对应的低温天数数组,这里提供两种可行方案:
方案一:直接实现(推荐,仅读取一次文件)
这种方法只需要遍历CSV文件一次,统计各年份符合条件的小时数,最后统一转换为天数,效率远高于多次调用现有函数。
function getDaysUnderTempDictionary(float $targetTemp): array { $file = fopen("data/temperatures-filtered.csv", "r"); $yearHours = []; // 存储各年份的符合条件小时数 while ($data = fgetcsv($file)) { $year = (int)$data[0]; $temp = (float)$data[4]; if ($temp <= $targetTemp) { // 对应年份小时数累加,未初始化则设为0后再加1 $yearHours[$year] = isset($yearHours[$year]) ? $yearHours[$year] + 1 : 1; } } fclose($file); // 将小时数转为天数,保留两位小数对齐示例输出格式 $yearDays = []; foreach ($yearHours as $year => $hours) { $yearDays[$year] = round($hours / 24, 2); } return $yearDays; }
方案二:复用现有getDaysUnderTemp函数(简单但效率低)
如果一定要复用现有函数,需要先提取CSV中所有唯一年份,再逐个调用原函数。但这种方法会多次打开并读取CSV文件,数据量大时性能很差,仅适合小数据场景。
function getDaysUnderTempDictionary(float $targetTemp): array { // 先提取所有唯一年份 $file = fopen("data/temperatures-filtered.csv", "r"); $uniqueYears = []; while ($data = fgetcsv($file)) { $year = (int)$data[0]; $uniqueYears[$year] = true; // 利用数组键去重 } fclose($file); // 遍历年份调用原函数生成结果 $result = []; foreach (array_keys($uniqueYears) as $year) { $result[$year] = round(getDaysUnderTemp($year, $targetTemp), 2); } return $result; }
测试调用getDaysUnderTempDictionary(-10),就能得到类似示例的数组输出,键为年份,值为保留两位小数的低温天数。
内容的提问来源于stack exchange,提问作者babygroot
相关产品推荐
相关产品推荐

