'Europe', * ], * [ * ['continent' => 'America', 'city' => 'Toronto'], * ['continent' => 'Europe', 'city' => 'Paris'], * 'selected' => 'Paris', * ], * ]; * * Notes: * - 'UTC/UTC' is mapped to 'UTC' to form a valid option * - a few timezone cities includes the country/state, such as Argentina/Buenos_Aires * - these arrays are designed to build timezone selects in template files with any HTML structure * * @param array $installedTimeZones List of installed timezones as string * @param string $preselectedTimezone preselected timezone (optional) * * @return array[] continents and cities **/ function generateTimeZoneData($installedTimeZones, $preselectedTimezone = '') { if ($preselectedTimezone == 'UTC') { $pcity = $pcontinent = 'UTC'; } else { // Try to split the provided timezone $spos = strpos($preselectedTimezone, '/'); $pcontinent = substr($preselectedTimezone, 0, $spos); $pcity = substr($preselectedTimezone, $spos + 1); } $continents = []; $cities = []; foreach ($installedTimeZones as $tz) { if ($tz == 'UTC') { $tz = 'UTC/UTC'; } $spos = strpos($tz, '/'); // Ignore invalid timezones if ($spos === false) { continue; } $continent = substr($tz, 0, $spos); $city = substr($tz, $spos + 1); $cities[] = ['continent' => $continent, 'city' => $city]; $continents[$continent] = true; } $continents = array_keys($continents); $continents['selected'] = $pcontinent; $cities['selected'] = $pcity; return [$continents, $cities]; } /** * Tells if a continent/city pair form a valid timezone * * Note: 'UTC/UTC' is mapped to 'UTC' * * @param string $continent the timezone continent * @param string $city the timezone city * * @return bool whether continent/city is a valid timezone */ function isTimeZoneValid($continent, $city) { return in_array( $continent . '/' . $city, timezone_identifiers_list() ); }