2010-06-28 6 views
3

J'ai une liste complète des fuseaux horaires dans un menu de sélection comme ceci:simplificatrices multiples echos

<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> 

la liste se poursuit toujours.

Je souhaite modifier chacune des options dans ce format:

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

Comment puis-je utiliser PHP pour éviter d'avoir à copier coller et modifier chacune des options manuellement ??

Répondre

6

Stockez les données dans une structure de données et utilisez une boucle. Par exemple, en utilisant une carte de nom de fuseau horaire pour compenser:

$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

Ok, imaginez que vous avez une variable contenant le formulaire ci-dessus, nous allons l'appeler $form et une autre variable contenant par exemple 'Africa/Abidjan' - $timezone.

$pattern = '/="'.str_replace('/', '\/', $timezone).'"/'; # /="Africa\/Abidjan"/ 
$replacement = '="'.$timezone.'" selected="selected"'; # ="Africa/Abidjan" selected="selected" 
$output_form = preg_replace($pattern, $replacement, $form); 

Je ne l'ai pas testé, mais ça devrait marcher.

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

Vous devez modifier uniquement la variable $cur_timezone. Pour chaque élément de $timezones_arr doit exister elemnt de $times_arr.

0

Ok, vous n'avez pas avec DOM, mais comme il y a déjà beaucoup d'autres réponses montrant différentes approches, voici comment le faire avec 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); 
} 

Le ci-dessus créent un liste des identificateurs de fuseau horaire (sans la différence GMT, voir DateTimeZone::listAbbreviations si vous en avez besoin) en tant qu'éléments <option> dans un élément <select>. Contrairement à votre code dans la question, la valeur utilisée pour l'attribut value est le décalage numérique dans le tableau renvoyé par DateTimeZone::listIdentifiers(); au lieu de l'identifiant de fuseau horaire lui-même. Vous pouvez appeler l'assistant avec l'identificateur de fuseau horaire ou l'ID numérique, par exemple.

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

serait à la fois le balisage

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

avec l'attribut selected dans la liste retournée.