How to get 7 day forecast from OpenWeatherMap using JSON Data?

user6302345 picture user6302345 · May 7, 2016 · Viewed 9.1k times · Source

I'm trying to make a Weather application. I know how to fetch the current conditions, but honestly I don't know too much JSON. I have no idea how to fetch the 7-day forecast from OpenWeatherMap. I've tried pretty much everything I can think of, but nothing is working. I'm trying to fetch it from PHP. I really don't get how it works, honestly. If anybody could help, that would be appreciated.

I put ['city']['name']; just as an example.

My PHP code:

<?php
$city="London";
$country="UK"; 
$url="http://api.openweathermap.org/data/2.5/forecast/daily?q=".$city.",".$country."&units=metric&cnt=7&lang=en&appid=c0c4a4b4047b97ebc5948ac9c48c0559";
$json=file_get_contents($url);
$data=json_decode($json,true);
$data['city']['name'];
?>

Here is the JSON data:

"city":{
"id":2643743,
"name":"London",
"coord":{
"lon":-0.12574,
"lat":51.50853
},
"country":"GB",
"population":0
},
"cod":"200",
"message":0.0132,
"cnt":7,
"list":[
{
"dt":1462532400,
"temp":{
"day":15.49,
"min":13.16,
"max":15.49,
"night":13.16,
"eve":15.49,
"morn":15.49
},
"pressure":1015.77,
"humidity":50,
"weather":[
{
"id":802,
"main":"Clouds",
"description":"scattered clouds",
"icon":"03n"
}
],
"speed":4.47,
"deg":116,
"clouds":48
},
{
"dt":1462618800,
"temp":{
"day":23.03,
"min":13.57,
"max":23.03,
"night":15.77,
"eve":21.37,
"morn":13.57
},
"pressure":1015.43,
"humidity":50,
"weather":[
{
"id":803,
"main":"Clouds",
"description":"broken clouds",
"icon":"04d"
}
],
"speed":4.43,
"deg":127,
"clouds":56
},
{
"dt":1462705200,
"temp":{
"day":24.2,
"min":16.14,
"max":24.53,
"night":18.32,
"eve":23.58,
"morn":16.14
},
"pressure":1016.42,
"humidity":42,
"weather":[
{
"id":803,
"main":"Clouds",
"description":"broken clouds",
"icon":"04d"
}
],
"speed":7.22,
"deg":121,
"clouds":68
},
{
"dt":1462791600,
"temp":{
"day":23.4,
"min":17.51,
"max":23.59,
"night":18.36,
"eve":22.42,
"morn":17.51
},
"pressure":1017.75,
"humidity":49,
"weather":[
{
"id":800,
"main":"Clear",
"description":"clear sky",
"icon":"02d"
}
],
"speed":8.36,
"deg":106,
"clouds":8
},
{
"dt":1462878000,
"temp":{
"day":22.79,
"min":16.59,
"max":22.88,
"night":17.15,
"eve":21.54,
"morn":16.59
},
"pressure":1013.95,
"humidity":50,
"weather":[
{
"id":802,
"main":"Clouds",
"description":"scattered clouds",
"icon":"03d"
}
],
"speed":8.53,
"deg":89,
"clouds":36
},
{
"dt":1462964400,
"temp":{
"day":19.18,
"min":13.92,
"max":19.18,
"night":14.57,
"eve":18.88,
"morn":13.92
},
"pressure":1004.19,
"humidity":0,
"weather":[
{
"id":500,
"main":"Rain",
"description":"light rain",
"icon":"10d"
}
],
"speed":3.24,
"deg":180,
"clouds":22,
"rain":2.13
},
{
"dt":1463050800,
"temp":{
"day":14.84,
"min":8.83,
"max":14.84,
"night":8.83,
"eve":12.92,
"morn":12.53
},
"pressure":1005.56,
"humidity":0,
"weather":[
{
"id":500,
"main":"Rain",
"description":"light rain",
"icon":"10d"
}
],
"speed":4.14,
"deg":325,
"clouds":73,
"rain":2.86
}
]
}

Sorry if this is a really dumb question, but any help would be appreciated, thanks!

Answer

eljamz picture eljamz · May 7, 2016

So you are actually getting the information for the next 6 days. look at the complete array do an

print_r($data);

As you can see at the complete result theres the 6 days, for example:

[5] => Array
            (
                [dt] => 1462964400
                [temp] => Array
                    (
                        [day] => 19.18
                        [min] => 13.92
                        [max] => 19.18
                        [night] => 14.57
                        [eve] => 18.88
                        [morn] => 13.92
                    )

                [pressure] => 1004.19
                [humidity] => 0
                [weather] => Array
                    (
                        [0] => Array
                            (
                                [id] => 500
                                [main] => Rain
                                [description] => light rain
                                [icon] => 10d
                            )

                    )

                [speed] => 3.24
                [deg] => 180
                [clouds] => 22
                [rain] => 2.13
            )

So what you need to do is a foreach

foreach($data['list'] as $day => $value) {
  echo "Max temperature for day " . $day . " will be " . $value[temp][max] . "<br />" ;
}

This will return:

Max temperature for day 0 will be 21.87
Max temperature for day 1 will be 23.03
Max temperature for day 2 will be 24.53
Max temperature for day 3 will be 23.59
Max temperature for day 4 will be 22.88
Max temperature for day 5 will be 19.18
Max temperature for day 6 will be 14.84

Hope this helps!