我可能整天都在努力解决这个问题。我已经在堆栈上阅读了多个问题,并且一直在阅读文章和检查文档,但我似乎无法弄清楚为什么这批代码只产生一个空输出。我错过了括号,说错了吗,等等?
<?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
。当我这样做,虽然他们甚至没有出现,所以我认为我的问题只是不知道如何解决它。
更新
我得出结论,这是我的网络托管服务。就像我添加var_dump($json)
一样,我得到一个空输出null
输出。
如果我运行error_reporting(E_ALL); ini_set('display_errors', 1);
,也要确认它是我的webhost,它指向不允许传出连接的文件php.ini。我在我的本地主服务器(raspberry pi)上编辑了相同的文件,运行相同的文件,它工作正常。
答案 0 :(得分:1)
像这样访问$ temp
$temp = $json->main->temp_min;
您将获得所需的输出。
此外,您需要在allow_url_fopen
配置文件中允许php.ini
。有些主机出于安全原因不允许这样做
答案 1 :(得分: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
);
答案 2 :(得分: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}
答案 3 :(得分:0)
json_decode()的第二个参数是assoc(associative)。默认情况下为0.当它为0(默认值)时,json_decode()将返回一个对象,而不是一个数组。这就是你无法使用$ json ['main'] ['temp_min']访问temp_min的原因;
但是如果使用值1作为第二个参数,该函数将返回一个数组。参数1表示将关联设置为1(真)。所以使用$ 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);
答案 4 :(得分: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
的更多信息