Я пытаюсь получить 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
? И когда нет атрибута города, он также пропускает остальную часть и не устанавливает lat
/lon
,
Примечание: причина различия между city
а также lat
/lon
погода API, который я запрашиваю предпочитает city
но не каждый ip может его предоставить.
Спасибо
Два вопроса:
1)
Вы должны использовать 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
}
}