Skip to content

Instantly share code, notes, and snippets.

@Cayahuanca
Last active June 17, 2025 15:23
Show Gist options
  • Save Cayahuanca/e154799c45c48986d3cce359391b138b to your computer and use it in GitHub Desktop.
Save Cayahuanca/e154799c45c48986d3cce359391b138b to your computer and use it in GitHub Desktop.
気象庁の Json を、扱いやすく変換する PHP。地域コードなどを変えれば、東京以外でも使える。
<?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);
?>
[
{
"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"
}
]
}
}
]
{
"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