Search code examples
phpjsonparsingweather-api

JSON-PHP:parse multiple object with the same name


I have got this problem: I am trying to display weather info from Weatherground and I' m receiving this response:

{
"response": {
"version":"0.1",
"termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"forecast": 1
}
  }
    ,
  "forecast":{
    "txt_forecast": {
    "date":"10:52 CEST",
    "forecastday": [
    {
    "period":0,
    "icon":"tstorms",
    "icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif",
    "title":"Venerdì",
    "fcttext":"Temporali. Max: 79º F. Venti da S variabili. Prob. pioggia: 80%.",
    "fcttext_metric":"Temporali. Max: 26º C. Venti da S variabili. Prob. pioggia: 80%.",
    "pop":"80"
    }
    ,
    {
    "period":1,
    "icon":"nt_rain",
    "icon_url":"http://icons.wxug.com/i/c/k/nt_rain.gif",
    "title":"Venerdì notte",
    "fcttext":"Pioggia e tuoni. Min: 62º F. Venti da ENE variabili. Prob. pioggia: 60%.",
    "fcttext_metric":"Pioggia e tuoni. Min: 17º C. Venti da ENE variabili. Prob. pioggia: 60%.",
    "pop":"60"
    }
    ,
    {
    "period":2,
    "icon":"tstorms",
    "icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif",
    "title":"Sabato",
    "fcttext":"Temporali. Max: 75º F. Venti da SSE variabili. Prob. pioggia: 90%.",
    "fcttext_metric":"Temporali. Max: 24º C. Venti da SSE variabili. Prob. pioggia: 90%.",
    "pop":"90"
    }

Using this code:

    <?php
    $json_string =   file_get_contents("http://api.wunderground.com/api/***/forecast/lang:IT/q/SW/Lugano.json");
     $parsed_json = json_decode($json_string);
     $date = $parsed_json->{'forecast'}->{'txt_forecast'}->{'date'};
     $named0 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}->{'title'};
     $txtd0 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}->{'fcttext'};

echo "$named0, $date: $txtd0";
 ?>

(I would like to get something like: Friday, 10:52CEST: Rainy day...)

But the problem is that I cannot display a forecast because the values for the second period ( period:1) have the same names of the first one.

I tried to put the link in http://jsonformatter.curiousconcept.com/ but it just shows me this: ...

"forecastday":[  
            {  
               "period":0,
               "icon":"tstorms",
               "icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif",
               "title":"Venerdì",
               "fcttext":"Temporali. Max: 79º F. Venti da S variabili. Prob. pioggia: 80%.",
               "fcttext_metric":"Temporali. Max: 26º C. Venti da S variabili. Prob. pioggia: 80%.",
               "pop":"80"
            },
            {  },
            {  },
            {  },
            {  },
            {  },
            {  },
            {  }

So the question is, how can I separate the different period like this:

period0: $named0, $date: $txtd0

period1: $named1, $date: $txtd1
....

Because in the code i see no way to get the first or 2nd 'title' of the response

$named0 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}->{'title'};

$named0 must get the value of the first 'title'

Thanky You and sorry for my english and my coding skills, I am still a newbie


Solution

  • 'forecastday' is decoded as array, so ypou can access it by:

    $name1 = $parsed_json->forecast->forecastday[1]->name;
    

    I your notation (have not used/tried that) it might be:

    $name1 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}[1]->{'title'};
    

    (The brakets do not go into the string / the '...') However, forecastday is an array, the others are Objects...