我在选择菜单中有完整的时区列表,如下所示:
<option value="Pacific/Kosrae"> Pacific/Kosrae( +11:00 GMT ) </option>
<option value="Pacific/Kwajalein"> Pacific/Kwajalein( +12:00 GMT ) </option>
<option value="Pacific/Majuro"> Pacific/Majuro( +12:00 GMT ) </option>
<option value="Pacific/Marquesas"> Pacific/Marquesas( -09:30 GMT ) </option>
<option value="Pacific/Midway"> Pacific/Midway( -11:00 GMT ) </option>
这个名单永远存在。
我想将每个选项更改为以下格式:
if($_SESSION['timezone'] == 'Africa/Abidjan') {
echo '<option selected="selected" value="Africa/Abidjan"> Africa/Abidjan( +00:00 GMT ) </option>';
} else {
echo '<option value="Africa/Abidjan"> Africa/Abidjan( +00:00 GMT ) </option>';
}
如何使用php避免手动复制粘贴和编辑每个选项?
答案 0 :(得分:6)
将数据存储在某些数据结构中,并使用循环。例如,使用从时区名称到偏移的地图:
$timezones = array(
'Pacific/Kosrae' => '+11:00',
'Pacific/Kwajalein' => '+12:00',
...
);
foreach($timezones as $name => $offset) {
echo "<option value=\"$name\"" . ($name == $_SESSION['timezone'] ? " selected" : "") . ">$name( $offset GMT ) </option>\n";
}
答案 1 :(得分:0)
好的,假设您有一个包含上述表单的变量,我们称之为$form
,另一个变量包含'Africa/Abidjan'
- $timezone.
$pattern = '/="'.str_replace('/', '\/', $timezone).'"/'; # /="Africa\/Abidjan"/
$replacement = '="'.$timezone.'" selected="selected"'; # ="Africa/Abidjan" selected="selected"
$output_form = preg_replace($pattern, $replacement, $form);
实际上没有测试过它,但它应该可以工作。
答案 2 :(得分:0)
$cur_timezone = 'Africa/Abidjan';
$timezones_arr = array ('Pacific/Kosrae','Pacific/Kwajalein',...);
$times_arr = array ('+11:00 GMT', '+12:00 GMT',...);
for ($i = 0; $i < count ($timezones_arr); $i ++) {
if ($timezones_arr[$i] == $cur_timezone) {
echo '<option selected="selected" value='$timezones_arr[$i]'>$timezones_arr[$i]($times_arr[$i]) </option>';
}
else {
echo '<option value='$timezones_arr[$i]'>$timezones_arr[$i]($times_arr[$i]) </option>';
}
}
您必须只更改变量$cur_timezone
。对于$timezones_arr
的每个元素,必须存在$times_arr
的元素。
答案 3 :(得分:0)
好的,你不必使用DOM,但由于已经有很多其他答案显示不同的方法,下面是如何用DOM做的:
function timezoneHelper($selected = NULL)
{
$dom = new DOMDocument;
$dom->formatOutput = TRUE;
$dom->loadXML('<select/>');
$dom->documentElement->setAttribute('name', 'timezone-selector');
$timezones = DateTimeZone::listIdentifiers();
if(!is_numeric($selected)) {
$selected = array_search($selected, $timezones);
}
foreach($timezones as $id => $timezone) {
$option = $dom->createElement('option', $timezone);
$option->setAttribute('value', $id);
if($id == $selected) {
$option->setAttribute('selected', 'selected');
}
$dom->documentElement->appendChild($option);
unset($option);
}
return $dom->saveXML($dom->documentElement);
}
以上内容将创建一个时区标识符列表(但不包括GMT差异。如果需要,请参阅DateTimeZone::listAbbreviations
)作为<option>
元素中的<select>
元素。与问题中的代码不同,value
属性使用的值是DateTimeZone::listIdentifiers();
返回的数组中的数字偏移量,而不是时区标识符本身。您可以使用时区标识符或数字ID调用帮助程序,例如
echo timezoneHelper('551');
// or
echo timezoneHelper('Zulu');
都会标记
<option value="551" selected="selected">Zulu</option>
返回列表中的selected
属性。