PHP if else语句测试api php字段是否为空

时间:2015-01-07 23:05:51

标签: php if-statement ip-geolocation

我试图从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

注意:区分citylat / lon的原因是我查询的天气api更喜欢city但不是每个ip都能提供一个。

由于

3 个答案:

答案 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
    }
}