92 lines
2.6 KiB
PHP
92 lines
2.6 KiB
PHP
<?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()
|
|
);
|
|
}
|