Last active
June 17, 2025 15:23
-
-
Save Cayahuanca/e154799c45c48986d3cce359391b138b to your computer and use it in GitHub Desktop.
気象庁の Json を、扱いやすく変換する PHP。地域コードなどを変えれば、東京以外でも使える。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
header('Content-Type: application/json; charset=UTF-8'); | |
// 元のJSONファイルのパス | |
$originalJsonFilePath = './weather.json'; | |
$originalJsonUrl = 'https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json'; | |
// 元のJSONファイルが存在するか確認 | |
if (!file_exists($originalJsonFilePath)) { | |
$originalJsonFilePath = $originalJsonUrl; | |
exit; | |
} | |
// 元のJSONデータを読み込む | |
$originalJson = file_get_contents($originalJsonFilePath); | |
$data = json_decode($originalJson, true); | |
// JSONデコードのエラーチェック | |
if (json_last_error() !== JSON_ERROR_NONE) { | |
http_response_code(500); | |
echo json_encode(['error' => 'Error decoding original weather.json: ' . json_last_error_msg()]); | |
exit; | |
} | |
// 地域コードを設定 | |
$areaName1 = "東京地方"; | |
$areaName2 = "東京"; | |
$areaCode1 = "130010"; | |
$areaCode2 = "44132"; | |
// 天気のコード, weatherCode との対応 | |
$weatherCodeArray = [ | |
100 => ["100.svg", "500.svg", "晴", "CLEAR"], | |
101 => ["101.svg", "501.svg", "晴時々曇", "PARTLY CLOUDY"], | |
102 => ["102.svg", "502.svg", "晴一時雨", "CLEAR, OCCASIONAL SCATTERED SHOWERS"], | |
103 => ["102.svg", "502.svg", "晴時々雨", "CLEAR, FREQUENT SCATTERED SHOWERS"], | |
104 => ["104.svg", "504.svg", "晴一時雪", "CLEAR, SNOW FLURRIES"], | |
105 => ["104.svg", "504.svg", "晴時々雪", "CLEAR, FREQUENT SNOW FLURRIES"], | |
106 => ["102.svg", "502.svg", "晴一時雨か雪", "CLEAR, OCCASIONAL SCATTERED SHOWERS OR SNOW FLURRIES"], | |
107 => ["102.svg", "502.svg", "晴時々雨か雪", "CLEAR, FREQUENT SCATTERED SHOWERS OR SNOW FLURRIES"], | |
108 => ["102.svg", "502.svg", "晴一時雨か雷雨", "CLEAR, OCCASIONAL SCATTERED SHOWERS AND/OR THUNDER"], | |
110 => ["110.svg", "510.svg", "晴後時々曇", "CLEAR, PARTLY CLOUDY LATER"], | |
111 => ["110.svg", "510.svg", "晴後曇", "CLEAR, CLOUDY LATER"], | |
112 => ["112.svg", "512.svg", "晴後一時雨", "CLEAR, OCCASIONAL SCATTERED SHOWERS LATER"], | |
113 => ["112.svg", "512.svg", "晴後時々雨", "CLEAR, FREQUENT SCATTERED SHOWERS LATER"], | |
114 => ["112.svg", "512.svg", "晴後雨", "CLEAR,RAIN LATER"], | |
115 => ["115.svg", "515.svg", "晴後一時雪", "CLEAR, OCCASIONAL SNOW FLURRIES LATER"], | |
116 => ["115.svg", "515.svg", "晴後時々雪", "CLEAR, FREQUENT SNOW FLURRIES LATER"], | |
117 => ["115.svg", "515.svg", "晴後雪", "CLEAR,SNOW LATER"], | |
118 => ["112.svg", "512.svg", "晴後雨か雪", "CLEAR, RAIN OR SNOW LATER"], | |
119 => ["112.svg", "512.svg", "晴後雨か雷雨", "CLEAR, RAIN AND/OR THUNDER LATER"], | |
120 => ["102.svg", "502.svg", "晴朝夕一時雨", "OCCASIONAL SCATTERED SHOWERS IN THE MORNING AND EVENING, CLEAR DURING THE DAY"], | |
121 => ["102.svg", "502.svg", "晴朝の内一時雨", "OCCASIONAL SCATTERED SHOWERS IN THE MORNING, CLEAR DURING THE DAY"], | |
122 => ["112.svg", "512.svg", "晴夕方一時雨", "CLEAR, OCCASIONAL SCATTERED SHOWERS IN THE EVENING"], | |
123 => ["100.svg", "500.svg", "晴山沿い雷雨", "CLEAR IN THE PLAINS, RAIN AND THUNDER NEAR MOUTAINOUS AREAS"], | |
124 => ["100.svg", "500.svg", "晴山沿い雪", "CLEAR IN THE PLAINS, SNOW NEAR MOUTAINOUS AREAS"], | |
125 => ["112.svg", "512.svg", "晴午後は雷雨", "CLEAR, RAIN AND THUNDER IN THE AFTERNOON"], | |
126 => ["112.svg", "512.svg", "晴昼頃から雨", "CLEAR, RAIN IN THE AFTERNOON"], | |
127 => ["112.svg", "512.svg", "晴夕方から雨", "CLEAR, RAIN IN THE EVENING"], | |
128 => ["112.svg", "512.svg", "晴夜は雨", "CLEAR, RAIN IN THE NIGHT"], | |
130 => ["100.svg", "500.svg", "朝の内霧後晴", "FOG IN THE MORNING, CLEAR LATER"], | |
131 => ["100.svg", "500.svg", "晴明け方霧", "FOG AROUND DAWN, CLEAR LATER"], | |
132 => ["101.svg", "501.svg", "晴朝夕曇", "CLOUDY IN THE MORNING AND EVENING, CLEAR DURING THE DAY"], | |
140 => ["102.svg", "502.svg", "晴時々雨で雷を伴う", "CLEAR, FREQUENT SCATTERED SHOWERS AND THUNDER"], | |
160 => ["104.svg", "504.svg", "晴一時雪か雨", "CLEAR, SNOW FLURRIES OR OCCASIONAL SCATTERED SHOWERS"], | |
170 => ["104.svg", "504.svg", "晴時々雪か雨", "CLEAR, FREQUENT SNOW FLURRIES OR SCATTERED SHOWERS"], | |
181 => ["115.svg", "515.svg", "晴後雪か雨", "CLEAR, SNOW OR RAIN LATER"], | |
200 => ["200.svg", "200.svg", "曇", "CLOUDY"], | |
201 => ["201.svg", "601.svg", "曇時々晴", "MOSTLY CLOUDY"], | |
202 => ["202.svg", "202.svg", "曇一時雨", "CLOUDY, OCCASIONAL SCATTERED SHOWERS"], | |
203 => ["202.svg", "202.svg", "曇時々雨", "CLOUDY, FREQUENT SCATTERED SHOWERS"], | |
204 => ["204.svg", "204.svg", "曇一時雪", "CLOUDY, OCCASIONAL SNOW FLURRIES"], | |
205 => ["204.svg", "204.svg", "曇時々雪", "CLOUDY FREQUENT SNOW FLURRIES"], | |
206 => ["202.svg", "202.svg", "曇一時雨か雪", "CLOUDY, OCCASIONAL SCATTERED SHOWERS OR SNOW FLURRIES"], | |
207 => ["202.svg", "202.svg", "曇時々雨か雪", "CLOUDY, FREQUENT SCCATERED SHOWERS OR SNOW FLURRIES"], | |
208 => ["202.svg", "202.svg", "曇一時雨か雷雨", "CLOUDY, OCCASIONAL SCATTERED SHOWERS AND/OR THUNDER"], | |
209 => ["200.svg", "200.svg", "霧", "FOG"], | |
210 => ["210.svg", "610.svg", "曇後時々晴", "CLOUDY, PARTLY CLOUDY LATER"], | |
211 => ["210.svg", "610.svg", "曇後晴", "CLOUDY, CLEAR LATER"], | |
212 => ["212.svg", "212.svg", "曇後一時雨", "CLOUDY, OCCASIONAL SCATTERED SHOWERS LATER"], | |
213 => ["212.svg", "212.svg", "曇後時々雨", "CLOUDY, FREQUENT SCATTERED SHOWERS LATER"], | |
214 => ["212.svg", "212.svg", "曇後雨", "CLOUDY, RAIN LATER"], | |
215 => ["215.svg", "215.svg", "曇後一時雪", "CLOUDY, SNOW FLURRIES LATER"], | |
216 => ["215.svg", "215.svg", "曇後時々雪", "CLOUDY, FREQUENT SNOW FLURRIES LATER"], | |
217 => ["215.svg", "215.svg", "曇後雪", "CLOUDY, SNOW LATER"], | |
218 => ["212.svg", "212.svg", "曇後雨か雪", "CLOUDY, RAIN OR SNOW LATER"], | |
219 => ["212.svg", "212.svg", "曇後雨か雷雨", "CLOUDY, RAIN AND/OR THUNDER LATER"], | |
220 => ["202.svg", "202.svg", "曇朝夕一時雨", "OCCASIONAL SCCATERED SHOWERS IN THE MORNING AND EVENING, CLOUDY DURING THE DAY"], | |
221 => ["202.svg", "202.svg", "曇朝の内一時雨", "CLOUDY OCCASIONAL SCCATERED SHOWERS IN THE MORNING"], | |
222 => ["212.svg", "212.svg", "曇夕方一時雨", "CLOUDY, OCCASIONAL SCCATERED SHOWERS IN THE EVENING"], | |
223 => ["201.svg", "601.svg", "曇日中時々晴", "CLOUDY IN THE MORNING AND EVENING, PARTLY CLOUDY DURING THE DAY,"], | |
224 => ["212.svg", "212.svg", "曇昼頃から雨", "CLOUDY, RAIN IN THE AFTERNOON"], | |
225 => ["212.svg", "212.svg", "曇夕方から雨", "CLOUDY, RAIN IN THE EVENING"], | |
226 => ["212.svg", "212.svg", "曇夜は雨", "CLOUDY, RAIN IN THE NIGHT"], | |
228 => ["215.svg", "215.svg", "曇昼頃から雪", "CLOUDY, SNOW IN THE AFTERNOON"], | |
229 => ["215.svg", "215.svg", "曇夕方から雪", "CLOUDY, SNOW IN THE EVENING"], | |
230 => ["215.svg", "215.svg", "曇夜は雪", "CLOUDY, SNOW IN THE NIGHT"], | |
231 => ["200.svg", "200.svg", "曇海上海岸は霧か霧雨", "CLOUDY, FOG OR DRIZZLING ON THE SEA AND NEAR SEASHORE"], | |
240 => ["202.svg", "202.svg", "曇時々雨で雷を伴う", "CLOUDY, FREQUENT SCCATERED SHOWERS AND THUNDER"], | |
250 => ["204.svg", "204.svg", "曇時々雪で雷を伴う", "CLOUDY, FREQUENT SNOW AND THUNDER"], | |
260 => ["204.svg", "204.svg", "曇一時雪か雨", "CLOUDY, SNOW FLURRIES OR OCCASIONAL SCATTERED SHOWERS"], | |
270 => ["204.svg", "204.svg", "曇時々雪か雨", "CLOUDY, FREQUENT SNOW FLURRIES OR SCATTERED SHOWERS"], | |
281 => ["215.svg", "215.svg", "曇後雪か雨", "CLOUDY, SNOW OR RAIN LATER"], | |
300 => ["300.svg", "300.svg", "雨", "RAIN"], | |
301 => ["301.svg", "701.svg", "雨時々晴", "RAIN, PARTLY CLOUDY"], | |
302 => ["302.svg", "302.svg", "雨時々止む", "SHOWERS THROUGHOUT THE DAY"], | |
303 => ["303.svg", "303.svg", "雨時々雪", "RAIN,FREQUENT SNOW FLURRIES"], | |
304 => ["300.svg", "300.svg", "雨か雪", "RAINORSNOW"], | |
306 => ["300.svg", "300.svg", "大雨", "HEAVYRAIN"], | |
308 => ["308.svg", "308.svg", "雨で暴風を伴う", "RAINSTORM"], | |
309 => ["303.svg", "303.svg", "雨一時雪", "RAIN,OCCASIONAL SNOW"], | |
311 => ["311.svg", "711.svg", "雨後晴", "RAIN,CLEAR LATER"], | |
313 => ["313.svg", "313.svg", "雨後曇", "RAIN,CLOUDY LATER"], | |
314 => ["314.svg", "314.svg", "雨後時々雪", "RAIN, FREQUENT SNOW FLURRIES LATER"], | |
315 => ["314.svg", "314.svg", "雨後雪", "RAIN,SNOW LATER"], | |
316 => ["311.svg", "711.svg", "雨か雪後晴", "RAIN OR SNOW, CLEAR LATER"], | |
317 => ["313.svg", "313.svg", "雨か雪後曇", "RAIN OR SNOW, CLOUDY LATER"], | |
320 => ["311.svg", "711.svg", "朝の内雨後晴", "RAIN IN THE MORNING, CLEAR LATER"], | |
321 => ["313.svg", "313.svg", "朝の内雨後曇", "RAIN IN THE MORNING, CLOUDY LATER"], | |
322 => ["303.svg", "303.svg", "雨朝晩一時雪", "OCCASIONAL SNOW IN THE MORNING AND EVENING, RAIN DURING THE DAY"], | |
323 => ["311.svg", "711.svg", "雨昼頃から晴", "RAIN, CLEAR IN THE AFTERNOON"], | |
324 => ["311.svg", "711.svg", "雨夕方から晴", "RAIN, CLEAR IN THE EVENING"], | |
325 => ["311.svg", "711.svg", "雨夜は晴", "RAIN, CLEAR IN THE NIGHT"], | |
326 => ["314.svg", "314.svg", "雨夕方から雪", "RAIN, SNOW IN THE EVENING"], | |
327 => ["314.svg", "314.svg", "雨夜は雪", "RAIN,SNOW IN THE NIGHT"], | |
328 => ["300.svg", "300.svg", "雨一時強く降る", "RAIN, EXPECT OCCASIONAL HEAVY RAINFALL"], | |
329 => ["300.svg", "300.svg", "雨一時みぞれ", "RAIN, OCCASIONAL SLEET"], | |
340 => ["400.svg", "400.svg", "雪か雨", "SNOWORRAIN"], | |
350 => ["300.svg", "300.svg", "雨で雷を伴う", "RAIN AND THUNDER"], | |
361 => ["411.svg", "811.svg", "雪か雨後晴", "SNOW OR RAIN, CLEAR LATER"], | |
371 => ["413.svg", "413.svg", "雪か雨後曇", "SNOW OR RAIN, CLOUDY LATER"], | |
400 => ["400.svg", "400.svg", "雪", "SNOW"], | |
401 => ["401.svg", "801.svg", "雪時々晴", "SNOW, FREQUENT CLEAR"], | |
402 => ["402.svg", "402.svg", "雪時々止む", "SNOWTHROUGHOUT THE DAY"], | |
403 => ["403.svg", "403.svg", "雪時々雨", "SNOW,FREQUENT SCCATERED SHOWERS"], | |
405 => ["400.svg", "400.svg", "大雪", "HEAVYSNOW"], | |
406 => ["406.svg", "406.svg", "風雪強い", "SNOWSTORM"], | |
407 => ["406.svg", "406.svg", "暴風雪", "HEAVYSNOWSTORM"], | |
409 => ["403.svg", "403.svg", "雪一時雨", "SNOW, OCCASIONAL SCCATERED SHOWERS"], | |
411 => ["411.svg", "811.svg", "雪後晴", "SNOW,CLEAR LATER"], | |
413 => ["413.svg", "413.svg", "雪後曇", "SNOW,CLOUDY LATER"], | |
414 => ["414.svg", "414.svg", "雪後雨", "SNOW,RAIN LATER"], | |
420 => ["411.svg", "811.svg", "朝の内雪後晴", "SNOW IN THE MORNING, CLEAR LATER"], | |
421 => ["413.svg", "413.svg", "朝の内雪後曇", "SNOW IN THE MORNING, CLOUDY LATER"], | |
422 => ["414.svg", "414.svg", "雪昼頃から雨", "SNOW, RAIN IN THE AFTERNOON"], | |
423 => ["414.svg", "414.svg", "雪夕方から雨", "SNOW, RAIN IN THE EVENING"], | |
425 => ["400.svg", "400.svg", "雪一時強く降る", "SNOW, EXPECT OCCASIONAL HEAVY SNOWFALL"], | |
426 => ["400.svg", "400.svg", "雪後みぞれ", "SNOW, SLEET LATER"], | |
427 => ["400.svg", "400.svg", "雪一時みぞれ", "SNOW, OCCASIONAL SLEET"], | |
450 => ["400.svg", "400.svg", "雪で雷を伴う", "SNOW AND THUNDER"] | |
]; | |
// 抜粋データを入れる場所 | |
$processedData = []; | |
// 発表時刻 5,11,17時の3回 | |
$reportDatetime = new DateTime($data[0]['reportDatetime'] ?? "1970-01-01T05:00:00+09:00"); | |
$processedData['reportDatetime']['original'] = $data[0]['reportDatetime']; | |
$processedData['reportDatetime']['full'] = $reportDatetime; | |
$processedData['reportDatetime']['year'] = $reportDatetime->format('Y'); | |
$processedData['reportDatetime']['month'] = $reportDatetime->format('m'); | |
$processedData['reportDatetime']['day'] = $reportDatetime->format('d'); | |
$processedData['reportDatetime']['hour'] = $reportDatetime->format('H'); | |
$reportDateMode = (int)$reportDatetime->format('H'); | |
// 各データを指定 | |
$timeSeries000 = $data[0]['timeSeries'][0]['areas'][0] ?? null; // timeSeriesData000 (今日と明日と明後日の天気天気種別、天気テキスト) | |
$timeSeries010 = $data[0]['timeSeries'][1]['areas'][0] ?? null; // timeSeriesData010 (今日と明日の6h毎の降水確率) | |
$timeSeries020 = $data[0]['timeSeries'][2]['areas'][0] ?? null; // timeSeriesData020 (今日と明日の最高最低気温) | |
$timeSeries100 = $data[1]['timeSeries'][0]['areas'][0] ?? null; // timeSeriesData100 (週間の天気種別と降水確率) | |
$timeSeries110 = $data[1]['timeSeries'][1]['areas'][0] ?? null; // timeSeriesData110 (週間の最高最低気温) | |
// 日付の処理 | |
$dayOfWeek = ['日', '月', '火', '水', '木', '金', '土']; | |
$rawDates = [ | |
'today' => $data[0]['timeSeries'][0]['timeDefines'][0] ?? null, | |
'tomorrow' => $data[0]['timeSeries'][0]['timeDefines'][1] ?? null, | |
'0' => $data[0]['timeSeries'][0]['timeDefines'][0] ?? null, | |
'1' => $data[0]['timeSeries'][0]['timeDefines'][1] ?? null, | |
'2' => $data[1]['timeSeries'][0]['timeDefines'][1] ?? null, | |
'3' => $data[1]['timeSeries'][0]['timeDefines'][2] ?? null, | |
'4' => $data[1]['timeSeries'][0]['timeDefines'][3] ?? null, | |
'5' => $data[1]['timeSeries'][0]['timeDefines'][4] ?? null, | |
'6' => $data[1]['timeSeries'][0]['timeDefines'][5] ?? null, | |
'7' => $data[1]['timeSeries'][0]['timeDefines'][6] ?? null | |
]; | |
$processedData['date'] = []; | |
foreach ($rawDates as $key => $dateString) { | |
if ($dateString) { | |
$dt = new DateTime($dateString); | |
$processedData['date'][$key] = [ | |
'full' => $dateString, | |
'year' => (int)$dt->format('Y'), | |
'month' => (int)$dt->format('n'), | |
'day' => (int)$dt->format('j'), | |
'dow' => $dayOfWeek[(int)$dt->format('w')] | |
]; | |
} else { | |
$processedData['date'][$key] = null; | |
} | |
} | |
// 天気のコード、アイコン番号 | |
$processedData['weatherCode'] = [ | |
'today' => $timeSeries000['weatherCodes'][0] ?? null, | |
'tomorrow' => $timeSeries000['weatherCodes'][1] ?? null, | |
'0' => $timeSeries000['weatherCodes'][0] ?? null, // 今日, 0日後 | |
'1' => $timeSeries000['weatherCodes'][1] ?? null, // 明日, 1日後 | |
'2' => $timeSeries000['weatherCodes'][2] ?? null, // 明後日, 2日後 | |
'3' => $timeSeries100['weatherCodes'][2] ?? null, // 3日後 | |
'4' => $timeSeries100['weatherCodes'][3] ?? null, // 4日後 | |
'5' => $timeSeries100['weatherCodes'][4] ?? null, // 5日後 | |
'6' => $timeSeries100['weatherCodes'][5] ?? null, // 6日後 | |
'7' => $timeSeries100['weatherCodes'][6] ?? null // 7日後 | |
]; | |
// 天気のアイコン番号 | |
$processedData['weatherIcon'] = [ | |
'today' => $weatherCodeArray[$timeSeries000['weatherCodes'][0]][$reportDateMode == 17 ? 1 : 0] ?? null, | |
'tomorrow' => $weatherCodeArray[$timeSeries000['weatherCodes'][1]][0] ?? null, | |
'0' => $weatherCodeArray[$timeSeries000['weatherCodes'][0]][$reportDateMode == 17 ? 1 : 0] ?? null, // 今日, 0日後 | |
'1' => $weatherCodeArray[$timeSeries000['weatherCodes'][1]][0] ?? null, // 明日, 1日後 | |
'2' => $weatherCodeArray[$timeSeries000['weatherCodes'][2]][0] ?? null, // 明後日, 2日後 | |
'3' => $weatherCodeArray[$timeSeries100['weatherCodes'][2]][0] ?? null, // 3日後 | |
'4' => $weatherCodeArray[$timeSeries100['weatherCodes'][3]][0] ?? null, // 4日後 | |
'5' => $weatherCodeArray[$timeSeries100['weatherCodes'][4]][0] ?? null, // 5日後 | |
'6' => $weatherCodeArray[$timeSeries100['weatherCodes'][5]][0] ?? null, // 6日後 | |
'7' => $weatherCodeArray[$timeSeries100['weatherCodes'][6]][0] ?? null // 7日後 | |
]; | |
// 天気の詳細テキスト (Json で書いてあるもの) | |
$processedData['weatherTextJa'] = [ | |
'today' => isset($timeSeries000['weathers'][0]) ? str_replace(' ', '', $timeSeries000['weathers'][0]) : null, | |
'tomorrow' => isset($timeSeries000['weathers'][1]) ? str_replace(' ', '', $timeSeries000['weathers'][1]) : null, | |
'0' => $weatherCodeArray[$timeSeries000['weatherCodes'][0]][2] ?? null, // 今日, 0日後 | |
'1' => $weatherCodeArray[$timeSeries000['weatherCodes'][1]][2] ?? null, // 明日, 1日後 | |
'2' => $weatherCodeArray[$timeSeries000['weatherCodes'][2]][2] ?? null, // 明後日, 2日後 | |
'3' => $weatherCodeArray[$timeSeries100['weatherCodes'][2]][2] ?? null, // 3日後 | |
'4' => $weatherCodeArray[$timeSeries100['weatherCodes'][3]][2] ?? null, // 4日後 | |
'5' => $weatherCodeArray[$timeSeries100['weatherCodes'][4]][2] ?? null, // 5日後 | |
'6' => $weatherCodeArray[$timeSeries100['weatherCodes'][5]][2] ?? null, // 6日後 | |
'7' => $weatherCodeArray[$timeSeries100['weatherCodes'][6]][2] ?? null // 7日後 | |
]; | |
$processedData['weatherTextEn'] = [ | |
'today' => $weatherCodeArray[$timeSeries000['weatherCodes'][0]][3] ?? null, | |
'tomorrow' => $weatherCodeArray[$timeSeries000['weatherCodes'][1]][3] ?? null, | |
'0' => $weatherCodeArray[$timeSeries000['weatherCodes'][0]][3] ?? null, // 今日, 0日後 | |
'1' => $weatherCodeArray[$timeSeries000['weatherCodes'][1]][3] ?? null, // 明日, 1日後 | |
'2' => $weatherCodeArray[$timeSeries000['weatherCodes'][2]][3] ?? null, // 明後日, 2日後 | |
'3' => $weatherCodeArray[$timeSeries100['weatherCodes'][2]][3] ?? null, // 3日後 | |
'4' => $weatherCodeArray[$timeSeries100['weatherCodes'][3]][3] ?? null, // 4日後 | |
'5' => $weatherCodeArray[$timeSeries100['weatherCodes'][4]][3] ?? null, // 5日後 | |
'6' => $weatherCodeArray[$timeSeries100['weatherCodes'][5]][3] ?? null, // 6日後 | |
'7' => $weatherCodeArray[$timeSeries100['weatherCodes'][6]][3] ?? null // 7日後 | |
]; | |
// 気温 | |
// 最高、最低気温は、予報発表時刻によって、今日と明日の要素数が変わるので注意 | |
$maxTempToday = "-"; | |
$minTempToday = "-"; | |
$minTempTomorrow = "-"; | |
$maxTempTomorrow = "-"; | |
$temp2DayCount = count($timeSeries020['temps']); | |
switch ($reportDateMode) { | |
case 5: // 5時発表 | |
$maxTempToday = $timeSeries020['temps'][0] ?? null; | |
$minTempToday = $timeSeries020['temps'][1] ?? null; | |
$minTempTomorrow = $timeSeries020['temps'][2] ?? null; | |
$maxTempTomorrow = $timeSeries020['temps'][3] ?? null; | |
break; | |
case 11: // 11時発表 | |
$maxTempToday = $timeSeries020['temps'][0] ?? null; | |
$minTempToday = $timeSeries020['temps'][1] ?? null; | |
$minTempTomorrow = $timeSeries020['temps'][2] ?? null; | |
$maxTempTomorrow = $timeSeries020['temps'][3] ?? null; | |
break; | |
case 17: // 17時発表 | |
$maxTempToday = "-"; | |
$minTempToday = "-"; | |
$minTempTomorrow = $timeSeries020['temps'][0] ?? null; | |
$maxTempTomorrow = $timeSeries020['temps'][1] ?? null; | |
break; | |
default: | |
if ($temp2DayCount <= 2) { | |
$minTempToday = "-"; | |
$minTempTomorrow = $timeSeries020['temps'][0] ?? null; | |
} | |
$minTempToday = $timeSeries020['temps'][1] ?? null; | |
$minTempTomorrow = $timeSeries020['temps'][2] ?? null; | |
break; | |
} | |
// 最高気温 | |
$processedData['maxTemperature'] = [ | |
'today' => $maxTempToday, | |
'tomorrow' => $maxTempTomorrow, | |
'0' => $maxTempToday, // 今日, 0日後 | |
'1' => $maxTempTomorrow, // 明日, 1日後 | |
'2' => $timeSeries110['tempsMax'][1] ?? null, // 明後日, 2日後 | |
'3' => $timeSeries110['tempsMax'][2] ?? null, // 3日後 | |
'4' => $timeSeries110['tempsMax'][3] ?? null, // 4日後 | |
'5' => $timeSeries110['tempsMax'][4] ?? null, // 5日後 | |
'6' => $timeSeries110['tempsMax'][5] ?? null, // 6日後 | |
'7' => $timeSeries110['tempsMax'][6] ?? null // 7日後 | |
]; | |
// 降水確率 | |
// 降水確率は、予報発表時刻によって、今日と明日の要素数が変わるので注意 | |
$popsToday = '-/-/-/-'; | |
$popsTomorrow = '-/-/-/-'; | |
$popsCount = count($timeSeries010['pops']); | |
switch ($reportDateMode) { | |
case 5: // 5時発表 | |
$popsToday = "-/" . $timeSeries010['pops'][0] . "/" . // 06時 | |
$timeSeries010['pops'][1] . "/" . // 12時 | |
$timeSeries010['pops'][2]; // 18時 | |
$popsTomorrow = $timeSeries010['pops'][3] . "/" . // 00時 | |
$timeSeries010['pops'][4] . "/" . // 06時 | |
$timeSeries010['pops'][5] . "/" . // 12時 | |
$timeSeries010['pops'][6]; // 18時 | |
break; | |
case 11: // 11時発表 | |
$popsToday = "-/-/" . $timeSeries010['pops'][0] . "/" . // 12時 | |
$timeSeries010['pops'][1]; // 18時 | |
$popsTomorrow = $timeSeries010['pops'][2] . "/" . // 00時 | |
$timeSeries010['pops'][3] . "/" . // 06時 | |
$timeSeries010['pops'][4] . "/" . // 12時 | |
$timeSeries010['pops'][5]; // 18時 | |
break; | |
case 17: // 17時発表 | |
$popsToday = "-/-/-/" . $timeSeries010['pops'][0]; // 18時 | |
$popsTomorrow = $timeSeries010['pops'][1] . "/" . // 00時 | |
$timeSeries010['pops'][2] . "/" . // 06時 | |
$timeSeries010['pops'][3] . "/" . // 12時 | |
$timeSeries010['pops'][4]; // 18時 | |
break; | |
default: | |
if ($popsCount <= 4) { | |
// 降水確率のデータが足りない場合はエラーを返す | |
http_response_code(500); | |
echo json_encode(['error' => 'Insufficient pops data in timeSeries010.']); | |
exit; | |
} | |
$popsToday = "-/-/-/-"; | |
$popsTomorrow = $timeSeries010['pops'][$popsCount - 4] . "/" . // 00時 | |
$timeSeries010['pops'][$popsCount - 3] . "/" . // 06時 | |
$timeSeries010['pops'][$popsCount - 2] . "/" . // 12時 | |
$timeSeries010['pops'][$popsCount - 1]; // 18時 | |
break; | |
} | |
$processedData['pops'] = [ | |
'today' => $popsToday ?? null, | |
'tomorrow' => $popsTomorrow ?? null, | |
'0' => $popsToday ?? null, // 今日, 0日後 | |
'1' => $popsTomorrow ?? null, // 明日, 1日後 | |
'2' => $timeSeries100['pops'][1] ?? null, // 明後日, 2日後 | |
'3' => $timeSeries100['pops'][2] ?? null, // 3日後 | |
'4' => $timeSeries100['pops'][3] ?? null, // 4日後 | |
'5' => $timeSeries100['pops'][4] ?? null, // 5日後 | |
'6' => $timeSeries100['pops'][5] ?? null, // 6日後 | |
'7' => $timeSeries100['pops'][6] ?? null // 7日後 | |
]; | |
$processedData['pops2day'] = [ | |
'000' => $timeSeries010['pops'][$popsCount - 8] ?? "-", // 今日の06時 | |
'006' => $timeSeries010['pops'][$popsCount - 7] ?? "-", // 今日の12時 | |
'012' => $timeSeries010['pops'][$popsCount - 6] ?? "-", // 今日の18時 | |
'018' => $timeSeries010['pops'][$popsCount - 5] ?? "-", // 明日の00時 | |
'100' => $timeSeries010['pops'][$popsCount - 4] ?? "-", // 明日の06時 | |
'106' => $timeSeries010['pops'][$popsCount - 3] ?? "-", // 明日の12時 | |
'112' => $timeSeries010['pops'][$popsCount - 2] ?? "-", // 明日の18時 | |
'118' => $timeSeries010['pops'][$popsCount - 1] ?? "-" // 明日の24時 | |
]; | |
// 処理されたデータをJSON形式で出力 | |
echo json_encode($processedData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); | |
?> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
"publishingOffice": "気象庁", | |
"reportDatetime": "2025-06-16T11:00:00+09:00", | |
"timeSeries": [ | |
{ | |
"timeDefines": [ | |
"2025-06-16T11:00:00+09:00", | |
"2025-06-17T00:00:00+09:00", | |
"2025-06-18T00:00:00+09:00" | |
], | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京地方", | |
"code": "130010" | |
}, | |
"weatherCodes": [ | |
"201", | |
"111", | |
"201" | |
], | |
"weathers": [ | |
"くもり 時々 晴れ 所により 夜のはじめ頃 まで 雨", | |
"晴れ 夕方 から くもり 所により 昼過ぎ から 雨 で 雷を伴う", | |
"くもり 時々 晴れ" | |
], | |
"winds": [ | |
"南の風", | |
"南の風", | |
"東の風 後 南の風" | |
], | |
"waves": [ | |
"0.5メートル", | |
"0.5メートル", | |
"0.5メートル" | |
] | |
}, | |
{ | |
"area": { | |
"name": "伊豆諸島北部", | |
"code": "130020" | |
}, | |
"weatherCodes": [ | |
"200", | |
"211", | |
"201" | |
], | |
"weathers": [ | |
"くもり 新島 では 昼前 雨", | |
"くもり 昼過ぎ から 晴れ", | |
"くもり 時々 晴れ" | |
], | |
"winds": [ | |
"南西の風 後 やや強く", | |
"西の風 やや強く 日中 南西の風 やや強く", | |
"北の風 後 南の風" | |
], | |
"waves": [ | |
"2メートル ただし 新島 では 2メートル 後 2.5メートル", | |
"2メートル ただし 新島 では 2.5メートル", | |
"1.5メートル ただし 新島 では 2メートル 後 1.5メートル" | |
] | |
}, | |
{ | |
"area": { | |
"name": "伊豆諸島南部", | |
"code": "130030" | |
}, | |
"weatherCodes": [ | |
"200", | |
"200", | |
"201" | |
], | |
"weathers": [ | |
"くもり 所により 昼前 雨", | |
"くもり 夜 晴れ", | |
"くもり 時々 晴れ" | |
], | |
"winds": [ | |
"西の風 やや強く", | |
"西の風 やや強く", | |
"西の風 後 北西の風" | |
], | |
"waves": [ | |
"2.5メートル", | |
"2.5メートル", | |
"2メートル 後 1.5メートル" | |
] | |
}, | |
{ | |
"area": { | |
"name": "小笠原諸島", | |
"code": "130040" | |
}, | |
"weatherCodes": [ | |
"200", | |
"200", | |
"200" | |
], | |
"weathers": [ | |
"くもり 所により 雨 で 雷を伴う", | |
"くもり 所により 昼前 まで 雨", | |
"くもり" | |
], | |
"winds": [ | |
"西の風", | |
"西の風 後 北西の風", | |
"北西の風" | |
], | |
"waves": [ | |
"1.5メートル", | |
"1.5メートル", | |
"1.5メートル" | |
] | |
} | |
] | |
}, | |
{ | |
"timeDefines": [ | |
"2025-06-16T12:00:00+09:00", | |
"2025-06-16T18:00:00+09:00", | |
"2025-06-17T00:00:00+09:00", | |
"2025-06-17T06:00:00+09:00", | |
"2025-06-17T12:00:00+09:00", | |
"2025-06-17T18:00:00+09:00" | |
], | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京地方", | |
"code": "130010" | |
}, | |
"pops": [ | |
"20", | |
"20", | |
"0", | |
"0", | |
"20", | |
"20" | |
] | |
}, | |
{ | |
"area": { | |
"name": "伊豆諸島北部", | |
"code": "130020" | |
}, | |
"pops": [ | |
"10", | |
"10", | |
"10", | |
"10", | |
"0", | |
"0" | |
] | |
}, | |
{ | |
"area": { | |
"name": "伊豆諸島南部", | |
"code": "130030" | |
}, | |
"pops": [ | |
"10", | |
"10", | |
"10", | |
"10", | |
"10", | |
"0" | |
] | |
}, | |
{ | |
"area": { | |
"name": "小笠原諸島", | |
"code": "130040" | |
}, | |
"pops": [ | |
"30", | |
"30", | |
"40", | |
"40", | |
"20", | |
"20" | |
] | |
} | |
] | |
}, | |
{ | |
"timeDefines": [ | |
"2025-06-16T09:00:00+09:00", | |
"2025-06-16T00:00:00+09:00", | |
"2025-06-17T00:00:00+09:00", | |
"2025-06-17T09:00:00+09:00" | |
], | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京", | |
"code": "44132" | |
}, | |
"temps": [ | |
"31", | |
"31", | |
"24", | |
"33" | |
] | |
}, | |
{ | |
"area": { | |
"name": "大島", | |
"code": "44172" | |
}, | |
"temps": [ | |
"31", | |
"31", | |
"24", | |
"27" | |
] | |
}, | |
{ | |
"area": { | |
"name": "八丈島", | |
"code": "44263" | |
}, | |
"temps": [ | |
"27", | |
"27", | |
"24", | |
"27" | |
] | |
}, | |
{ | |
"area": { | |
"name": "父島", | |
"code": "44301" | |
}, | |
"temps": [ | |
"30", | |
"30", | |
"26", | |
"30" | |
] | |
} | |
] | |
} | |
] | |
}, | |
{ | |
"publishingOffice": "気象庁", | |
"reportDatetime": "2025-06-16T11:00:00+09:00", | |
"timeSeries": [ | |
{ | |
"timeDefines": [ | |
"2025-06-17T00:00:00+09:00", | |
"2025-06-18T00:00:00+09:00", | |
"2025-06-19T00:00:00+09:00", | |
"2025-06-20T00:00:00+09:00", | |
"2025-06-21T00:00:00+09:00", | |
"2025-06-22T00:00:00+09:00", | |
"2025-06-23T00:00:00+09:00" | |
], | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京地方", | |
"code": "130010" | |
}, | |
"weatherCodes": [ | |
"111", | |
"201", | |
"201", | |
"201", | |
"201", | |
"201", | |
"201" | |
], | |
"pops": [ | |
"", | |
"30", | |
"30", | |
"20", | |
"30", | |
"30", | |
"30" | |
], | |
"reliabilities": [ | |
"", | |
"", | |
"A", | |
"A", | |
"A", | |
"A", | |
"A" | |
] | |
}, | |
{ | |
"area": { | |
"name": "伊豆諸島", | |
"code": "130100" | |
}, | |
"weatherCodes": [ | |
"200", | |
"201", | |
"201", | |
"201", | |
"201", | |
"201", | |
"201" | |
], | |
"pops": [ | |
"", | |
"30", | |
"30", | |
"20", | |
"30", | |
"30", | |
"30" | |
], | |
"reliabilities": [ | |
"", | |
"", | |
"A", | |
"A", | |
"A", | |
"A", | |
"A" | |
] | |
}, | |
{ | |
"area": { | |
"name": "小笠原諸島", | |
"code": "130040" | |
}, | |
"weatherCodes": [ | |
"200", | |
"200", | |
"200", | |
"200", | |
"200", | |
"201", | |
"201" | |
], | |
"pops": [ | |
"", | |
"40", | |
"40", | |
"30", | |
"30", | |
"30", | |
"30" | |
], | |
"reliabilities": [ | |
"", | |
"", | |
"C", | |
"B", | |
"A", | |
"A", | |
"B" | |
] | |
} | |
] | |
}, | |
{ | |
"timeDefines": [ | |
"2025-06-17T00:00:00+09:00", | |
"2025-06-18T00:00:00+09:00", | |
"2025-06-19T00:00:00+09:00", | |
"2025-06-20T00:00:00+09:00", | |
"2025-06-21T00:00:00+09:00", | |
"2025-06-22T00:00:00+09:00", | |
"2025-06-23T00:00:00+09:00" | |
], | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京", | |
"code": "44132" | |
}, | |
"tempsMin": [ | |
"", | |
"24", | |
"24", | |
"23", | |
"22", | |
"23", | |
"24" | |
], | |
"tempsMinUpper": [ | |
"", | |
"27", | |
"25", | |
"24", | |
"24", | |
"24", | |
"25" | |
], | |
"tempsMinLower": [ | |
"", | |
"22", | |
"22", | |
"21", | |
"21", | |
"22", | |
"22" | |
], | |
"tempsMax": [ | |
"", | |
"34", | |
"33", | |
"31", | |
"30", | |
"30", | |
"32" | |
], | |
"tempsMaxUpper": [ | |
"", | |
"36", | |
"34", | |
"33", | |
"32", | |
"33", | |
"35" | |
], | |
"tempsMaxLower": [ | |
"", | |
"32", | |
"30", | |
"29", | |
"27", | |
"28", | |
"30" | |
] | |
}, | |
{ | |
"area": { | |
"name": "八丈島", | |
"code": "44263" | |
}, | |
"tempsMin": [ | |
"", | |
"22", | |
"19", | |
"19", | |
"19", | |
"21", | |
"22" | |
], | |
"tempsMinUpper": [ | |
"", | |
"23", | |
"20", | |
"20", | |
"20", | |
"22", | |
"24" | |
], | |
"tempsMinLower": [ | |
"", | |
"18", | |
"17", | |
"17", | |
"17", | |
"19", | |
"20" | |
], | |
"tempsMax": [ | |
"", | |
"27", | |
"26", | |
"26", | |
"26", | |
"26", | |
"27" | |
], | |
"tempsMaxUpper": [ | |
"", | |
"28", | |
"27", | |
"27", | |
"28", | |
"28", | |
"29" | |
], | |
"tempsMaxLower": [ | |
"", | |
"25", | |
"24", | |
"24", | |
"25", | |
"25", | |
"25" | |
] | |
}, | |
{ | |
"area": { | |
"name": "父島", | |
"code": "44301" | |
}, | |
"tempsMin": [ | |
"", | |
"26", | |
"25", | |
"25", | |
"26", | |
"26", | |
"26" | |
], | |
"tempsMinUpper": [ | |
"", | |
"27", | |
"27", | |
"27", | |
"28", | |
"28", | |
"28" | |
], | |
"tempsMinLower": [ | |
"", | |
"24", | |
"23", | |
"24", | |
"24", | |
"24", | |
"25" | |
], | |
"tempsMax": [ | |
"", | |
"31", | |
"31", | |
"31", | |
"31", | |
"31", | |
"31" | |
], | |
"tempsMaxUpper": [ | |
"", | |
"33", | |
"32", | |
"32", | |
"32", | |
"33", | |
"32" | |
], | |
"tempsMaxLower": [ | |
"", | |
"29", | |
"29", | |
"30", | |
"30", | |
"30", | |
"30" | |
] | |
} | |
] | |
} | |
], | |
"tempAverage": { | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京", | |
"code": "44132" | |
}, | |
"min": "19.0", | |
"max": "26.3" | |
}, | |
{ | |
"area": { | |
"name": "八丈島", | |
"code": "44263" | |
}, | |
"min": "20.0", | |
"max": "24.3" | |
}, | |
{ | |
"area": { | |
"name": "父島", | |
"code": "44301" | |
}, | |
"min": "24.9", | |
"max": "29.1" | |
} | |
] | |
}, | |
"precipAverage": { | |
"areas": [ | |
{ | |
"area": { | |
"name": "東京", | |
"code": "44132" | |
}, | |
"min": "25.8", | |
"max": "53.9" | |
}, | |
{ | |
"area": { | |
"name": "八丈島", | |
"code": "44263" | |
}, | |
"min": "65.3", | |
"max": "133.3" | |
}, | |
{ | |
"area": { | |
"name": "父島", | |
"code": "44301" | |
}, | |
"min": "0.9", | |
"max": "12.8" | |
} | |
] | |
} | |
} | |
] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"reportDatetime": { | |
"original": "2025-06-16T11:00:00+09:00", | |
"full": { | |
"date": "2025-06-16 11:00:00.000000", | |
"timezone_type": 1, | |
"timezone": "+09:00" | |
}, | |
"year": "2025", | |
"month": "06", | |
"day": "16", | |
"hour": "11" | |
}, | |
"date": { | |
"today": { | |
"full": "2025-06-16T11:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 16, | |
"dow": "月" | |
}, | |
"tomorrow": { | |
"full": "2025-06-17T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 17, | |
"dow": "火" | |
}, | |
"0": { | |
"full": "2025-06-16T11:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 16, | |
"dow": "月" | |
}, | |
"1": { | |
"full": "2025-06-17T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 17, | |
"dow": "火" | |
}, | |
"2": { | |
"full": "2025-06-18T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 18, | |
"dow": "水" | |
}, | |
"3": { | |
"full": "2025-06-19T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 19, | |
"dow": "木" | |
}, | |
"4": { | |
"full": "2025-06-20T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 20, | |
"dow": "金" | |
}, | |
"5": { | |
"full": "2025-06-21T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 21, | |
"dow": "土" | |
}, | |
"6": { | |
"full": "2025-06-22T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 22, | |
"dow": "日" | |
}, | |
"7": { | |
"full": "2025-06-23T00:00:00+09:00", | |
"year": 2025, | |
"month": 6, | |
"day": 23, | |
"dow": "月" | |
} | |
}, | |
"weatherCode": { | |
"today": "201", | |
"tomorrow": "111", | |
"0": "201", | |
"1": "111", | |
"2": "201", | |
"3": "201", | |
"4": "201", | |
"5": "201", | |
"6": "201", | |
"7": "201" | |
}, | |
"weatherIcon": { | |
"today": "201.svg", | |
"tomorrow": "110.svg", | |
"0": "201.svg", | |
"1": "110.svg", | |
"2": "201.svg", | |
"3": "201.svg", | |
"4": "201.svg", | |
"5": "201.svg", | |
"6": "201.svg", | |
"7": "201.svg" | |
}, | |
"weatherTextJa": { | |
"today": "くもり時々晴れ所により夜のはじめ頃まで雨", | |
"tomorrow": "晴れ夕方からくもり所により昼過ぎから雨で雷を伴う", | |
"0": "曇時々晴", | |
"1": "晴後曇", | |
"2": "曇時々晴", | |
"3": "曇時々晴", | |
"4": "曇時々晴", | |
"5": "曇時々晴", | |
"6": "曇時々晴", | |
"7": "曇時々晴" | |
}, | |
"weatherTextEn": { | |
"today": "MOSTLY CLOUDY", | |
"tomorrow": "CLEAR, CLOUDY LATER", | |
"0": "MOSTLY CLOUDY", | |
"1": "CLEAR, CLOUDY LATER", | |
"2": "MOSTLY CLOUDY", | |
"3": "MOSTLY CLOUDY", | |
"4": "MOSTLY CLOUDY", | |
"5": "MOSTLY CLOUDY", | |
"6": "MOSTLY CLOUDY", | |
"7": "MOSTLY CLOUDY" | |
}, | |
"maxTemperature": { | |
"today": "31", | |
"tomorrow": "33", | |
"0": "31", | |
"1": "33", | |
"2": "34", | |
"3": "33", | |
"4": "31", | |
"5": "30", | |
"6": "30", | |
"7": "32" | |
}, | |
"minTemperature": { | |
"today": "31", | |
"tomorrow": "24", | |
"0": "31", | |
"1": "24", | |
"2": "24", | |
"3": "24", | |
"4": "23", | |
"5": "22", | |
"6": "23", | |
"7": "24" | |
}, | |
"pops": { | |
"today": "-/-/20/20", | |
"tomorrow": "0/0/20/20", | |
"0": "-/-/20/20", | |
"1": "0/0/20/20", | |
"2": "30", | |
"3": "30", | |
"4": "20", | |
"5": "30", | |
"6": "30", | |
"7": "30" | |
}, | |
"pops2day": { | |
"000": "-", | |
"006": "-", | |
"012": "20", | |
"018": "20", | |
"100": "0", | |
"106": "0", | |
"112": "20", | |
"118": "20" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment