JSON-PHP:解析具有相同名称的多个对象

时间:2014-08-01 10:02:29

标签: php json parsing weather-api

我遇到了这个问题:我正在尝试显示Weatherground的天气信息,而我正在尝试我收到此回复:

{
"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"
    }

使用此代码:

    <?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";
 ?>

(我希望得到类似的结果:星期五,10:52CEST:雨天......)

但问题是我无法显示预测,因为第二期(期间:1)的值与第一期的值相同。

我试图将链接放在http://jsonformatter.curiousconcept.com/中,但它只是告诉我这个: ...

"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"
            },
            {  },
            {  },
            {  },
            {  },
            {  },
            {  },
            {  }

所以问题是,我怎样才能将这样的不同时期分开:

period0: $named0, $date: $txtd0

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

因为在代码中我认为无法获得第一个或第二个标题&#39;的回应

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

$ named0 必须获得第一个&#39;

的价值

谢谢你,对不起我的英语和编码技巧,我还是个新手

3 个答案:

答案 0 :(得分:0)

&#39; forecastday&#39;被解码为数组,因此你可以通过以下方式访问它:

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

我的符号(未使用/尝试过)可能是:

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

(这些行李不会进入字符串/&#39; ...&#39;) 但是,forecastday是一个数组,其他的是Objects ...

答案 1 :(得分:0)

像这样:

  $data = json_decode('{"response": {"version":"0.1","termsofService":"http://www.wunderground.co/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"}]}}}');


  foreach ($data->forecast->txt_forecast->forecastday as $forecast)
  {
      echo printf("%s, %s, %s<br/>", $forecast->title, $data->forecast->txt_forecast->date, $forecast->fcttext);
  }

答案 2 :(得分:0)

即使您将json_decode作为对象,也可以像对待数组一样循环预测日。

foreach( $parsed_json->response->forecast->txt_forecast->forecastday as $key=> $day )
{
    print( 'Period' . $day->period . ': ' );
    print( $day->title . ', ' );
    print( $parsed_json->response->forecast->txt_forecast->date . ' ' );
    print( $day->fcttext );
}

或者你可以像这样直接访问它:

$forecastzerotitle = $parsed_json->response->forecast->txt_forecast->forecastday[0]->title );