#php
Вопрос:
Итак, у меня есть функция ниже, и вот что я пытаюсь сделать:
У меня много операторов if/else, может ли кто-нибудь просмотреть код и сказать мне, могу ли я сократить их и вернуться раньше? Вся помощь будет оценена по достоинству!
Каждая часть там имеет решающее значение, но я хотел посмотреть, есть ли способ иметь только один оператор if (максимум 2) без лазейки для возможной ошибки отладки.
Вот код:
/**
* Convert coordinates to timezone
*
* @param $lat
* @param $lng
* @return string
*/
public function get_office_timezone_from_coordinates($lat, $lng): string
{
// Return a numerically indexed array containing all defined timezone identifiers
$timezone_ids = DateTimeZone::listIdentifiers();
// List all the timezones in the array
if ($timezone_ids amp;amp; is_array($timezone_ids) amp;amp; isset($timezone_ids[0])) {
$time_zone = '';
$tz_distance = 0;
// Either grab the first timezone, or loop through the array and check for timezone.
if (count($timezone_ids) == 1) {
$time_zone = $timezone_ids[0];
} else {
foreach ($timezone_ids as $timezone_id) {
// Grab the TimeZone and grab the locations coordinates
$timezone = new DateTimeZone($timezone_id);
$location = $timezone->getLocation();
$timezone_lat = $location['latitude'];
$timezone_lng = $location['longitude'];
// Calculate the input coords to match the timezone coords.
$theta = $lng - $timezone_lng;
$distance = (sin(deg2rad($lat)) * sin(deg2rad($timezone_lat)))
(cos(deg2rad($lat)) * cos(deg2rad($timezone_lat)) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = abs(rad2deg($distance));
// If the timezone is not set or tz_distance variable at 0 is higher than distance, set the time_zone and distance.
if (!$time_zone || $tz_distance > $distance) {
$time_zone = $timezone_id;
$tz_distance = $distance;
}
}
}
// This returns 'America/Chicago' for example
return $time_zone;
}
return '';
}
Ответ №1:
Просто отмените (логически) свои if
условия, чтобы вы могли вернуться раньше.
Для первого if
это было бы:
if (!$timezone_ids || !is_array($timezone_ids) || !isset($timezone_ids[0])) {
return '';
}