我试图从ip geolocation api中获取city
属性。
从api返回的样本:
{"as":"AS38484 Virgin Broadband VISP","city":"Adelaide","country":"Australia","countryCode":"AU","isp":"iseek Communications","lat":-27,"lon":133,"org":"iseek Communications","query":"1.178.0.144","region":"","regionName":"","status":"success","timezone":"","zip":""}
我的代码:
$query = '{"as":"AS38484 Virgin Broadband VISP","city":"Adelaide","country":"Australia","countryCode":"AU","isp":"iseek Communications","lat":-27,"lon":133,"org":"iseek Communications","query":"1.178.0.144","region":"","regionName":"","status":"success","timezone":"","zip":""}';
$query = @unserialize($query);
if($query && $query['status'] == 'success') {
if(!empty($query['city'])) {
$city = $query['city'];
// routine that uses $city gets called
} else {
$lat = $query['lat'];
$lon = $query['lon'];
// routine that uses $lat, $lon gets called
}
}
基本上,if(!empty($query['city']))
的行为并不像预期的那样(不是我真的知道,上周我一直在使用PHP)。我还尝试在if语句之前设置$city
,然后测试if($city != '')
。
问题:没有条件组合查找,然后将城市属性设置为city
?如果没有城市属性,它也会跳过其他部分,并且不会设置lat
/ lon
。
注意:区分city
和lat
/ lon
的原因是我查询的天气api更喜欢city
但不是每个ip都能提供一个。
由于
答案 0 :(得分:2)
$ query不是一个序列化的PHP数组,如果你在unserialize
调用之前没有使用'@',你就会看到它。它看起来像JSON,所以也许json_decode
正是你要找的?
答案 1 :(得分:1)
两个问题:
1)
您需要使用json_decode
来反序列化json数据
2) 由于它将反序列化为对象,因此您将使用
访问字段 $query->city;
不
$query['city'];
答案 2 :(得分:0)
正如@ kao3991和@andrew所说,您的数据是JSON而不是序列化数组。试试这个:
$query = '{"as":"AS38484 Virgin Broadband VISP","city":"Adelaide","country":"Australia","countryCode":"AU","isp":"iseek Communications","lat":-27,"lon":133,"org":"iseek Communications","query":"1.178.0.144","region":"","regionName":"","status":"success","timezone":"","zip":""}';
$query = json_decode($query, true);
if($query && $query['status'] == 'success') {
if(!empty($query['city'])) {
$city = $query['city'];
// routine that uses $city gets called
} else {
$lat = $query['lat'];
$lon = $query['lon'];
// routine that uses $lat, $lon gets called
}
}