Я не использовал бы HEREDOC вообще для этого, лично. Это просто не делает для хорошего "шаблона, создающего" систему. Весь Ваш HTML заблокирован вниз в строке, которая имеет несколько недостатков
Получают основной движок шаблонов, или просто используют PHP с, включает - это - почему язык имеет <?php
и ?>
разделители.
template_file.php
<html>
<head>
<title><?php echo $page_title; ?></title>
</head>
<body>
<?php echo getPageContent(); ?>
</body>
index.php
<?php
$page_title = "This is a simple demo";
function getPageContent() {
return '<p>Hello World!</p>';
}
include('template_file.php');
Я бы сделал это на PHP, за исключением того, что я бы не стал несколько раз выполнять preg_match 100 и сделал бы это для создания вашего списка.
$tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
Кроме того, я бы использовал имена PHP для «часовых поясов» и забыл о смещениях по Гринвичу, которые будут меняться в зависимости от летнего времени. Такой код в phpbb - это только такой способ, потому что они все еще поддерживают PHP4 и не могут полагаться на присутствующие там объекты DateTime или DateTimeZone.
первый вариант позволит вам взять значение из $ _POST ['whateveryoucalltheselect'] и добавить его в UTC. или даже сохраните это значение, а затем всегда вызывайте UTC + userTZsetting, когда вам это понадобится позже. мне кажется самым простым. последний вариант был бы гораздо более ценным, если бы часовые пояса менялись часто.
Ни один из них. Вместо этого подготовьте массив в PHP с этими часовыми поясами. Подобно
$arr[0] = "(GMT+02:00) Harare, Pretoria";
$arr[1] = "(GMT+03:00) Jerusalem";
или
$arr[0] = array("America/Campo_Grande", "(GMT+02:00) Harare, Pretoria");
$arr[1] = array("America/Israel", "(GMT+03:00) Jerusalem");
и так далее. Затем сгенерируйте форму на основе этого массива:
foreach ($arr as $k => $v)
$str .= "<option value=$k>$v[1]</option>";
И тогда вы можете легко переключаться на другие форматы, просто изменив код в строке выше. Также проверка будет намного проще и не потребует регулярных выражений. Просто сравните значение, отправленное POST или GET, с массивом. Теперь легко установить, что $ arr [$ value_sent_by_form] [0] содержит значение, совместимое с PHP, а $ arr [$ value_sent_by_form] [1] удобное для пользователя значение.
Я бы сделал это с помощью следующего кода, который похож на принятый ответ (я знаю, что код можно отредактировать :)):
$list = DateTimeZone::listAbbreviations();
$idents = DateTimeZone::listIdentifiers();
$data = $offset = $added = array();
foreach ($list as $abbr => $info) {
foreach ($info as $zone) {
if ( ! empty($zone['timezone_id'])
AND
! in_array($zone['timezone_id'], $added)
AND
in_array($zone['timezone_id'], $idents)) {
$z = new DateTimeZone($zone['timezone_id']);
$c = new DateTime(null, $z);
$zone['time'] = $c->format('H:i a');
$offset[] = $zone['offset'] = $z->getOffset($c);
$data[] = $zone;
$added[] = $zone['timezone_id'];
}
}
}
array_multisort($offset, SORT_ASC, $data);
$options = array();
foreach ($data as $key => $row) {
$options[$row['timezone_id']] = $row['time'] . ' - '
. formatOffset($row['offset'])
. ' ' . $row['timezone_id'];
}
// now you can use $options;
function formatOffset($offset) {
$hours = $offset / 3600;
$remainder = $offset % 3600;
$sign = $hours > 0 ? '+' : '-';
$hour = (int) abs($hours);
$minutes = (int) abs($remainder / 60);
if ($hour == 0 AND $minutes == 0) {
$sign = ' ';
}
return 'GMT' . $sign . str_pad($hour, 2, '0', STR_PAD_LEFT)
.':'. str_pad($minutes,2, '0');
}
Это дает что-то вроде:
<option value="America/Boise" label="02:10 am - GMT-06:00 America/Boise">02:10 am - GMT-06:00 America/Boise</option>
<option value="America/Denver" label="02:10 am - GMT-06:00 America/Denver">02:10 am - GMT-06:00 America/Denver</option>
<option value="America/Edmonton" label="02:10 am - GMT-06:00 America/Edmonton">02:10 am - GMT-06:00 America/Edmonton</option>
<option value="America/Inuvik" label="02:10 am - GMT-06:00 America/Inuvik">02:10 am - GMT-06:00 America/Inuvik</option>
<option value="America/Shiprock" label="02:10 am - GMT-06:00 America/Shiprock">02:10 am - GMT-06:00 America/Shiprock</option>
<option value="America/Belize" label="02:10 am - GMT-05:00 America/Belize">02:10 am - GMT-05:00 America/Belize</option>
Надежда, которая немного помогает и / или вдохновляет вас на создание чего-то лучшего.