12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- <?php
- /**
- * Generates a list of available timezone continents and cities.
- *
- * Two distinct array based on available timezones
- * and the one selected in the settings:
- * - (0) continents:
- * + list of available continents
- * + special key 'selected' containing the value of the selected timezone's continent
- * - (1) cities:
- * + list of available cities associated with their continent
- * + special key 'selected' containing the value of the selected timezone's city (without the continent)
- *
- * Example:
- * [
- * [
- * 'America',
- * 'Europe',
- * 'selected' => '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()
- );
- }
|