Упрощение множественного эха - PullRequest
3 голосов
/ 28 июня 2010

У меня есть полный список часовых поясов в меню выбора, например:

<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, чтобы избежать необходимости вставлять и редактировать каждый из параметров вручную ??

Ответы [ 4 ]

6 голосов
/ 28 июня 2010

Сохраните данные в некоторой структуре данных и используйте цикл. Например, используя карту от имени часового пояса до смещения:

$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 голосов
/ 28 июня 2010

Хорошо, вам не нужно это делать с 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(); вместо самого идентификатора часового пояса.Вы можете вызвать помощника с помощью идентификатора часового пояса или числового идентификатора, хотя, например,

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

приведет к разметке

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

с атрибутом selected в возвращенном списке.

0 голосов
/ 28 июня 2010
$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 голосов
/ 28 июня 2010

Хорошо, представьте, что у вас есть переменная, содержащая форму выше, давайте назовем ее $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);

На самом деле ее не проверяли, ноэто должно работать.

...