Я пытаюсь получить атрибут 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 способен его предоставить.
благодаря
Два вопроса:
1) Вы должны использовать json_decode
для json_decode
данных json
2) Поскольку он будет десериализовать объект, вы получите доступ к полям с помощью
$query->city;
не
$query['city'];
$ query - это не сериализованный массив PHP, вы увидите его, если бы вы не использовали '@' перед вызовом unserialize
. это похоже на JSON, так что, может быть, json_decode
- это то, что вы ищете?
Поскольку @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
}
}