Уменьшите количество условий if/else, если сможете вернуться раньше

#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 '';
}