如何通过OpenWeatherMap API获取未来3天每日最高最低气温?
实现未来3天每日最高/最低温统计
原代码的问题在于直接遍历每3小时的原始数据,导致同一天重复输出,且未筛选目标日期范围。同时注意$val['main']['day']是OpenWeatherMap OneCall API的字段,当前使用的Forecast API中不存在,需移除该无效代码。
核心逻辑
- 按日期分组:将每3小时的气温数据按自然日归类
- 计算每日极值:对每组数据取最高温和最低温
- 筛选目标日期:跳过当日,仅保留未来3天的数据并按要求格式输出
修改后的完整代码
$api_forecast = 'https://api.openweathermap.org/data/2.5/forecast?q=berlin,DE,DE&appid='.$api_key; $forecast_data = json_decode(file_get_contents($api_forecast), true); // 存储每日的最高/最低温及显示日期 $dailyForecast = []; foreach ($forecast_data['list'] as $val) { // 提取纯日期(用于分组的键) $dateKey = date('Y-m-d', strtotime($val['dt_txt'])); // 转换为摄氏度(保留数值用于计算) $currentMax = round($val['main']['temp_max'] - 273.15); $currentMin = round($val['main']['temp_min'] - 273.15); // 初始化当日数据 if (!isset($dailyForecast[$dateKey])) { $dailyForecast[$dateKey] = [ 'max_temp' => $currentMax, 'min_temp' => $currentMin, 'display_date' => date('l d.m', strtotime($val['dt_txt'])) // 格式:周四 15.09 ]; } else { // 更新当日最高温(取更大值) if ($currentMax > $dailyForecast[$dateKey]['max_temp']) { $dailyForecast[$dateKey]['max_temp'] = $currentMax; } // 更新当日最低温(取更小值) if ($currentMin < $dailyForecast[$dateKey]['min_temp']) { $dailyForecast[$dateKey]['min_temp'] = $currentMin; } } } // 筛选并输出未来3天的数据 $today = date('Y-m-d'); $displayCount = 0; foreach ($dailyForecast as $dateKey => $dayData) { // 跳过当日 if ($dateKey === $today) { continue; } // 仅显示3天 if ($displayCount >= 3) { break; } echo '<strong>' . $dayData['display_date'] . ':</strong> 最高温: ' . $dayData['max_temp'] . '°C/最低温: ' . $dayData['min_temp'] . '°C<br>'; $displayCount++; }
关键说明
- 用
Y-m-d作为分组键,确保同一天的所有时段数据被归为一组 - 遍历过程中持续更新每日的最高/最低温,确保最终值为全天的极值
- 通过
$today和$displayCount控制输出范围,仅保留未来3天的数据 - 输出格式完全匹配需求,无需额外表格结构
内容的提问来源于stack exchange,提问作者claudio
相关产品推荐
相关产品推荐

