2010-06-28 27 views
3

我時區的完整列表中選擇菜單,如下所示:簡化多個回聲

<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來避免複製粘貼和手動編輯每個選項?

回答

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"; 
} 
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); 

還沒有真正測試過它,但它應該工作。

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

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); 
} 

以上將創建一個時區標識符列表(如果需要,請參閱DateTimeZone::listAbbreviations)作爲元素中的<option>元素。與問題中的代碼不同,用於value屬性的值是由DateTimeZone::listIdentifiers();返回的數組中的數字偏移量,而不是時區標識符本身。儘管可以使用時區標識符或數字ID來調用助手,例如

echo timezoneHelper('551'); 
// or 
echo timezoneHelper('Zulu'); 

既能標記

<option value="551" selected="selected">Zulu</option> 

在列表中selected屬性返回。