{"coord":{"lon":73.69,"lat":17.8},"sys":{"message":0.109,"country":"IN","sunrise":1393032482,"sunset":1393074559},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}],"base":"cmc stations","main":{"temp":293.999,"temp_min":293.999,"temp_max":293.999,"pressure":962.38,"sea_level":1025.86,"grnd_level":962.38,"humidity":78},"wind":{"speed":1.15,"deg":275.503},"clouds":{"all":0},"dt":1393077388,"id":1264491,"name":"Mahabaleshwar","cod":200}
我试图从json上面的天气中获取描述但是在php中出错。我试过下面的PHP代码:
$jsonDecode = json_decode($contents, true);
$result=array();
foreach($jsonDecode as $data)
{
foreach($data{'weather'} as $data2)
{
echo $data2{'description'};
}
}
感谢任何帮助。我是使用json的新手。
答案 0 :(得分:1)
您必须使用方括号([]
)来访问数组元素,而不是卷曲元素({}
)。
因此,应更改代码以反映这些更改:
foreach($data['weather'] as $data2)
{
echo $data2['description'];
}
此外,您的外部foreach
循环将导致您的代码执行与您想要的完全不同的操作,您应该这样做:
foreach($jsonDecode['weather'] as $data2)
{
echo $data2['description'];
}
答案 1 :(得分:1)
你的$ jsonDecode似乎是一个数组,所以这应该有效 -
foreach($jsonDecode['weather'] as $data)
{
echo $data['description'];
}
答案 2 :(得分:1)
您可以直接使用范围访问数据
$json = '{"coord":{"lon":73.69,"lat":17.8},"sys":{"message":0.109,"country":"IN","sunrise":1393032482,"sunset":1393074559},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}],"base":"cmc stations","main":{"temp":293.999,"temp_min":293.999,"temp_max":293.999,"pressure":962.38,"sea_level":1025.86,"grnd_level":962.38,"humidity":78},"wind":{"speed":1.15,"deg":275.503},"clouds":{"all":0},"dt":1393077388,"id":1264491,"name":"Mahabaleshwar","cod":200}';
$jsonDecode = json_decode($json, true);
echo $jsonDecode['weather'][0]['description'];
//output Sky is Clear
正如你所看到的,wheater`被范围所包围,这意味着它是另一个数组。如果您有多个结果,则可以循环抛出该数组
foreach($jsonDecode['weather'] as $weather)
{
echo $weather['description'];
}
答案 3 :(得分:0)
您必须使用“[]”运算符
访问“weather” 像这样,$data["weather"]
答案 4 :(得分:0)
如果decode的结果是数组,请使用:
$data['weather']
如果结果是对象,请使用:
$data->weather
答案 5 :(得分:0)
在你的问题中有几件值得回答的事情:
问:json_decode($data)
和json_decode($data, true)
之间的区别是什么?
答:前者将JSON对象转换为PHP对象,后者创建了一个关联数组:http://uk1.php.net/json_decode
在任何一种情况下,迭代结果都没有意义。您可能只想访问“天气”字段:
$o = json_decode($data)
=>使用$weather = $o->weather
$a = json_decode($data, true)
=>使用$weather = $a['weather']
一旦你有'天气'字段,仔细看看它是什么:
"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}]
这是一个包含单个对象的数组。这意味着您需要迭代它,或使用$clearSky = $weather[0]
。在这种情况下,你选择哪种json_decode方法无关紧要=> JSON数组总是被解码为PHP(数字索引)数组。
但是,一旦你得到$clearSky
,你正在访问该对象并且它再次重要,你选择哪种方法 - 使用箭头或括号,类似于第一步。
因此,获取天气描述的正确方法可能是:
json_decode($data)->weather[0]->description
json_decode($data, true)['weather'][0]['description']
注意:在后一种情况下,仅在PHP 5.4或更高版本中支持取消引用函数调用的结果。在PHP 5.3或更早版本中,您必须创建一个变量。
注意:我还建议您始终使用isset
检查结果中是否实际设置了预期字段。否则,您将尝试访问未定义的字段,这会引发错误。