如何基于CSV数据实现按年份统计低温天数的字典生成函数
PHP函数:getDaysUnderTempDictionary实现
实现方案
下面提供两种实现方式,分别对应复用已有函数和直接处理CSV的场景:
方案一:复用getDaysUnderTemp函数
先从CSV中提取所有唯一年份,再逐个调用已有函数统计对应年份的低温天数,最终整理为目标格式数组。
function getDaysUnderTempDictionary($targetTemp) { // 替换为你的CSV实际路径 $csvFilePath = 'temperature_records.csv'; $uniqueYears = []; // 读取CSV收集所有唯一年份 if (($fileHandle = fopen($csvFilePath, 'r')) !== false) { // 跳过表头行 fgetcsv($fileHandle); while (($row = fgetcsv($fileHandle)) !== false) { $year = (int)$row[0]; if (!in_array($year, $uniqueYears)) { $uniqueYears[] = $year; } } fclose($fileHandle); } $result = []; // 遍历年份调用已有函数统计 foreach ($uniqueYears as $year) { // 复用getDaysUnderTemp函数,传入年份和目标温度 $coldDays = getDaysUnderTemp($year, $targetTemp); // 保留两位小数匹配示例格式 $result[$year] = round($coldDays, 2); } return $result; }
方案二:直接处理CSV文件(无依赖)
无需依赖已有函数,直接遍历CSV数据按年份累计符合条件的小时数,最后转换为天数。
function getDaysUnderTempDictionary($targetTemp) { $csvFilePath = 'temperature_records.csv'; $yearHourStats = []; if (($fileHandle = fopen($csvFilePath, 'r')) !== false) { // 跳过表头 fgetcsv($fileHandle); while (($row = fgetcsv($fileHandle)) !== false) { $year = (int)$row[0]; $currentTemp = (float)$row[4]; // 累计符合低温条件的小时数 if ($currentTemp <= $targetTemp) { $yearHourStats[$year] = isset($yearHourStats[$year]) ? $yearHourStats[$year] + 1 : 1; } } fclose($fileHandle); } // 转换小时数为天数并保留两位小数 $finalResult = []; foreach ($yearHourStats as $year => $hours) { $finalResult[$year] = round($hours / 24, 2); } // 按年份升序排序(可选,让结果更规整) ksort($finalResult); return $finalResult; }
使用示例
调用函数后将返回符合要求的数组:
Array ( [2019] => 3.88 [2020] => 0.21 [2021] => 13.92 )
注意:请根据实际场景修改代码中的CSV文件路径;若数据量较大,直接处理CSV的方案性能更优,避免多次读取文件。
内容的提问来源于stack exchange,提问作者fallguy
相关产品推荐
相关产品推荐

