如果能够提前返回,则减少if/else条件语句的数量



所以我有下面的函数,下面是我要做的:

我有很多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 && is_array($timezone_ids) && 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 '';
}

只需(从逻辑上(否定if条件,即可提前返回。

对于第一个if,它将是:

if (!$timezone_ids || !is_array($timezone_ids) || !isset($timezone_ids[0])) {
return '';
}

最新更新