2014-10-06 3 views
0

Я, наверное, весь день пытался понять это. Я прочитал несколько вопросов здесь, в стеке, а также читал статьи и проверял документацию, но я не могу понять, почему эта партия кода просто производит нулевой вывод. Я пропустил скобки, называя что-то не так, ect?PHP-декодирование JSON - нулевой вывод

<?php 
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial"; 
$str = file_get_contents($url); 
$json = json_decode($str); 
$temp = $json['main']['temp_min']; 
$content = $temp; 


$array = array(
    "content" => $content, 
     refresh_requency => 30 

); 


echo json_encode($array); 
?> 

Снова то, что я прошу, может кто-то указать мне или сказать мне, что я делаю неправильно. Это мой сервер, который просто не обрабатывает данные правильно? Это может быть возможностью.

Еще одна вещь, которую я пробовал, - это просто распечатать $temp и/или другую переменную, например $str. Когда я это делаю, хотя они даже не появляются, так что я думаю, что моя проблема просто не уверена, как ее исправить.

Update

Я пришел к выводу, что это мой веб-хостинг. Как будто я добавляю var_dump($json) Я получаю нулевой вывод null.

Также, чтобы подтвердить, что его мой веб-хост, если я запустил error_reporting(E_ALL); ini_set('display_errors', 1);, указывает на файл php.ini, не позволяющий исходящие соединения. Я отредактировал тот же самый файл на моем локальном домашнем сервере (малина pi), выполнив тот же файл, и он отлично работает.

+0

http://php.net/manual /en/function.json-decode.php читайте аргументы для 'json_decode()', если вы хотите декодировать как массив, установите для второго аргумента значение true. –

ответ

0
$json = json_decode($str, true); 

Вам нужен второй аргумент для преобразования строки json в ассоциативный массив вместо объекта. И вы пытаетесь использовать массив ($json['main']['temp_min']), а не объект. Также

$array = array(
    "content" => $content, 
    "refresh_requency" => 30 
); 

Код выглядит

<?php 
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial"; 
$str = file_get_contents($url); 
$json = json_decode($str, true); 
$content = $json['main']['temp_min']; 

$array = array(
"content" => $content, 
"refresh_requency" => 30 
); 

echo json_encode($array); 

И результат http://codepad.viper-7.com/euBNAk:

{"content":44.6,"refresh_requency":30} 
+1

Снова я добавляю '$ str, true)' там раньше, и это не изменилось тогда или сейчас. – pears456

+0

Eveything работает! http://codepad.viper-7.com/euBNAk – Cheery

+0

Должен быть моим сервером в качестве комментатора другого ответа, предлагайте var_dump ($ json) и выдает вывод NULL. Не уверен, что случилось с моим сервисом веб-хостинга. – pears456

1

Access $ темп как этот

$temp = $json->main->temp_min; 

вы получите желаемый результат.

Кроме того, вы должны разрешить allow_url_fopen в конфигурационном файле php.ini. Некоторые хосты запрещают его по соображениям безопасности

+0

На самом деле я пробовал это сейчас, когда вы предложили, и я попробовал это раньше, и это не имело значения. – pears456

+0

ok var_dump ($ json); и проверьте, имеет ли он контент или нет. –

+0

Нет содержимого. Я предполагаю, что это проблема с моим провайдером веб-хостинга. – pears456

0

Второй параметр json_decode() является ассоциативным (ассоциативным). По умолчанию оно равно 0. Когда он равен 0 (по умолчанию), json_decode() возвращает объект, а не массив. Вот почему вы не можете получить доступ к temp_min, используя $ json ['main'] ['temp_min'];

Однако если вы используете значение 1 в качестве второго параметра, функция вернет массив. Параметр 1 означает установление ассоциативного отношения к 1 (true). Поэтому используйте $ json = json_decode ($ str, true); вместо $ json = json_decode ($ str) ;. Вы сможете получить доступ с помощью $ json ['main'] ['temp_min']; Теперь.

Также вы забыли двойную кавычку в строке 13 (refresh_requency). Удачи.

<?php 

$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial"; 
$str = file_get_contents($url); 
$json = json_decode($str, true); 

$temp = $json['main']['temp_min']; 
$content = $temp; 


$array = array(
    "content" => $content, 
    "refresh_requency" => 30 
); 

echo json_encode($array); 
0

Просто хочу помочь

я изменить свой код, как это и это будет правильно

<?php 
    $url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial"; 
    $str = file_get_contents($url); 
    $json = json_decode($str, TRUE); // Wrong here 
    $temp = $json['main']['temp_min']; 
    $content = $temp; 

    $array = array(
     "content" => $content, 
     "refresh_requency" => 30   // And wrong here, it's must string 
    ); 

    echo json_encode($array); 
?> 

Более подробную информацию о JSon декодировании в PHP для массива или объекта http://php.net/manual/en/function.json-decode.php

1

Ниже рабочее решение для вашего вышеуказанного кода:

<?php 
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial"; 
$str = file_get_contents($url); 
$json = json_decode($str, true); 
$temp = $json['main']['temp_min']; 
$content = $temp; 


$array = array(
    "content" => $content, 
     "refresh_requency" => 30 

); 


echo json_encode($array); 
?> 

Когда я выполнил свой код, я нашел 2 проблемы в вашем фрагменте кода:

1) Вы пытались использовать объект типа StdClass как массив.

Решение:

<?php 
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial"; 
$str = file_get_contents($url); 
$json = json_decode($str); 
$temp = $json->main->temp_min; 
$content = $temp; 


$array = array(
    "content" => $content, 
     "refresh_requency" => 30 

); 


echo json_encode($array); 
?> 

2) Вы не поставили ключ массива в кавычки:

$array = array(
    "content" => $content, 
     refresh_requency => 30 

); 

Оно должно быть:

$array = array(
    "content" => $content, 
     "refresh_requency" => 30 

); 
Смежные вопросы