2015-12-30 3 views
1

Я использую WU api для получения почасовых метеорологических данных. API возвращает JSON с несколькими часовыми значениями, и я хочу, чтобы запросить тот, что мне нужно:Поиск ключа в Json (вложенный массив) PHP

JSon:

{ 
    "response": { 
    "version":"0.1", 
    "termsofService":"http://www.wunderground.com/weather/api/d/terms.html", 
    "features": { 
    "hourly": 1 
    } 
    } 
     , 
    "hourly_forecast": [ 
     { 
     "FCTTIME": { 
     "hour": "13","hour_padded": "13","min": "00","min_unpadded": "0","sec": "0","year": "2015","mon": "12","mon_padded": "12","mon_abbrev": "Dec","mday": "30","mday_padded": "30","yday": "363","isdst": "0","epoch": "1451509200","pretty": "1:00 PM PST on December 30, 2015","civil": "1:00 PM","month_name": "December","month_name_abbrev": "Dec","weekday_name": "Wednesday","weekday_name_night": "Wednesday Night","weekday_name_abbrev": "Wed","weekday_name_unlang": "Wednesday","weekday_name_night_unlang": "Wednesday Night","ampm": "PM","tz": "","age": "","UTCDATE": "" 
     }, 
     "temp": {"english": "60", "metric": "16"}, 
     "dewpoint": {"english": "34", "metric": "1"}, 
     "condition": "Clear", 
     "icon": "clear" 
     } 
     , 
     { 
     "FCTTIME": { 
     ... 
     } 
     , 
     "FCTTIME": { 
     ... 
     }, 
     ... more FCTTIME 
    ] 
} 

Это мой код, чтобы получить hourly_forecast как массив:

$jsonRequest = file_get_contents("weather.json"); 
$data   = json_decode($jsonRequest, true); 

$array = @$data['hourly_forecast']; 

Мне нужно получить temp и condition за "hour": "13". Таким образом, PHP напечатал бы что-то вроде: The weather is $condition with $temp degree.

ответ

1

Вы должны иметь возможность перебирать набор почасовых прогнозов, и когда вы найдете тот, который соответствует часу, который вы ищете, получите значения, которые вы хотите от этого прогноза и затем вырваться из цикла.

foreach ($data['hourly_forecast'] as $forecast) { 
    if ($forecast['FCTTIME']['hour'] == 13) { 
     $condition = $forecast['condition']; 
     $temp = $forecast['temp']; 
     break; 
    } 
} 
+0

Это работает, мне пришлось изменить в '$ Temp = $ forecast ['temp'] ['english']; ' – Casper

2

Сначала не конвертируйте объект в массив, нет необходимости.

Меняем $data = json_decode($jsonRequest, true);

Для $data = json_decode($jsonRequest);

Затем цикл по $data->hourly_forecast массива в поисках определенного времени вам нужно, как этот

foreach($data->hourly_forecast as $forecast) { 
    if ($forecast->FCTTIME->hour == 13) { 
     echo 'The time ' . $forecast->FCTTIME->hour.PHP_EOL; 
     echo 'The temp F' . $forecast->temp->english.PHP_EOL; 
     echo 'The temp C' . $forecast->temp->metric.PHP_EOL; 
     echo 'The condition ' . $forecast->condition.PHP_EOL; 

     // if this is all you need, stop looping 
     break; 
    } 
} 
+0

По какой-то причине этот цикл ничего не повторяет. – Casper

+1

Вы изменили '$ data = json_decode ($ jsonRequest);' – RiggsFolly

+0

Я действительно протестировал его, и он работает для меня с использованием PHP CLI, возможно, вы должны изменить 'PHP_EOL' на' '
' ', если вы используете браузер – RiggsFolly