PHP if else оператор проверяет, является ли поле api php пустым

0

Я пытаюсь получить атрибут city из ip-геолокации api. Пример того, что возвращается из 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 для этой последней недели). Я также попытался установить $city перед оператором if, а затем проверить if($city != '').

Вопрос: Никакая комбинация условий не находит, а затем устанавливает атрибут city в city? И когда нет атрибута города, он также пропускает часть else и не устанавливает lat/lon.

Примечание: причина дифференциации между city и lat/lon - это погода api, которую я запрашиваю, предпочитает city но не каждый ip способен его предоставить.

благодаря

  • 0
    И в чем вопрос?
  • 0
    Точка с запятой есть в коде :). Атрибут города не найден - проблема, извините, отредактирую.
Теги:
if-statement
ip-geolocation

3 ответа

1
Лучший ответ

Два вопроса:

1) Вы должны использовать json_decode для json_decode данных json

2) Поскольку он будет десериализовать объект, вы получите доступ к полям с помощью

 $query->city;

не

 $query['city'];
2

$ query - это не сериализованный массив PHP, вы увидите его, если бы вы не использовали '@' перед вызовом unserialize. это похоже на JSON, так что, может быть, json_decode - это то, что вы ищете?

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню