public function geocode($address)
{
if (!filter_var($address, FILTER_VALIDATE_IP)) {
throw new UnsupportedOperation('The GeoIP2 provider does not support street addresses, only IP addresses.');
}
if ('127.0.0.1' === $address) {
return $this->returnResults([$this->getLocalhostDefaults()]);
}
$result = json_decode($this->executeQuery($address));
$adminLevels = [];
if (isset($result->subdivisions) && is_array($result->subdivisions)) {
foreach ($result->subdivisions as $i => $subdivision) {
$name = isset($subdivision->names->{$this->locale}) ? $subdivision->names->{$this->locale} : null;
$code = isset($subdivision->iso_code) ? $subdivision->iso_code : null;
if (null !== $name || null !== $code) {
$adminLevels[] = ['name' => $name, 'code' => $code, 'level' => $i + 1];
}
}
}
return $this->returnResults([$this->fixEncoding(array_merge($this->getDefaults(), array('countryCode' => isset($result->country->iso_code) ? $result->country->iso_code : null, 'country' => isset($result->country->names->{$this->locale}) ? $result->country->names->{$this->locale} : null, 'locality' => isset($result->city->names->{$this->locale}) ? $result->city->names->{$this->locale} : null, 'latitude' => isset($result->location->latitude) ? $result->location->latitude : null, 'longitude' => isset($result->location->longitude) ? $result->location->longitude : null, 'timezone' => isset($result->location->time_zone) ? $result->location->time_zone : null, 'postalCode' => isset($result->postal->code) ? $result->postal->code : null, 'adminLevels' => $adminLevels)))]);
}