2009-05-27 14 views
0

Ich habe diesen Code:Warum funktioniert diese php-Schleife nicht?

$thisTime = gmmktime(0, 0, 0); 
      for($i=0; $i<=95; $i++) 
      { 
       $perfTimeNumber = ($i+1); 
       $perfTimestamp = $thisTime; 
       $perfTime = date("H:i", $perfTimestamp);   
     echo '<option value="'. $perfTimeNumber .'" selected="'.$sel.'">' .$perfTime .'</option>'; 
       $thisTime = $thisTime+(15*60); 
      } 

Dies funktioniert einen Auswahleingang mit Optionen von 01:00 bis zu 24:45 in 15-Minuten-Takt zu erzeugen. Allerdings, wenn ich den Code ändern, und fügen Sie eine if-Anweisung ich einige merkwürdige Ergebnisse erhalten ...

$thisTime = gmmktime(0, 0, 0); 

      for($i=0; $i<=95; $i++) 
      { 
       $perfTimeNumber = ($i+1); 
       $perfTimestamp = $thisTime; 
       $perfTime = date("H:i", $perfTimestamp); 
       if ($perfTime == '19:30') { 
        $sel = "selected"; 
       } 
     echo '<option value="'. $perfTimeNumber .'" selected="'.$sel.'">' .$perfTime .'</option>'; 

       $thisTime = $thisTime+(15*60); 
      } 

Die Idee ist (willkürlich!) Machen den Select-Eingang Standard bis 19.30 Uhr. Der obige Code fügt
selected = "selected" zu jeder Option nach 19:30 hinzu, nicht nur zur Option 19:30. Wenn ich die if-Anweisung leicht auf if ($perfTime = '19:30') { ... ändere, d. H. Mit einer einzigen anstelle von ==, erzeugt sie eine Reihe von Optionen, die alle den Wert 19:30 haben. Was mache ich falsch?

+0

Bitte den Code Abschlag für Quellcode anstelle von HTML-Code-Tags in der Zukunft. Probieren Sie die entsprechenden Schaltflächen im Editor aus oder fügen Sie die Codeblöcke einfach um vier Leerzeichen ein und umgeben Sie den Inline-Code mit Backticks ('). – OregonGhost

Antwort

5

Kurze Antwort: Weil jede einzelne Echooperation den aktuellen Wert von $ sel verwendet. Ich nehme an, dass es anfänglich leer ist, also enthalten die ersten N Echos ausgewählt = ''. Wenn der Test erfolgreich ist, wird $ sel auf "ausgewählt" gesetzt, und jeder spätere Ausdruck enthält ausgewählt = "ausgewählt". Wenn Sie $ perfTime = '19: 30 'verwenden, handelt es sich um eine Zuweisung, so dass der Test immer erfolgreich ist und $ sel immer' ausgewählt 'ist.

Schnellkorrektur: Fügen Sie eine Else-Klausel hinzu, die $ sel = '' festlegt. Es gibt jedoch andere Seltsamkeiten, die mich denken lassen, dass dies nur ein Code-Snippit ist (d. H. Immer $ thisTime für $ perfTimestamp verwendet, anstatt etwas mit einer Schleife indiziert, so dass es immer die gleiche Zeit druckt?).

+0

das macht Sinn. Wusste, es wäre einfach! Hier ist aber eine komische Sache ... Ich habe den Code geändert, um eine else-Klausel hinzuzufügen, und ich kann sagen, indem ich auf die Quelle schaue, dass 19:30 jetzt ausgewählt wird. Das Problem ist, dass das Auswahlmenü nicht auf diesen Wert voreingestellt ist! – musoNic80

+0

Adam, was sind deine Sorgen über $ thisTime? Ich initialisiere es bis 1 Uhr morgens, bevor ich mit dem Looping beginne. Gibt es einen besseren Weg, dies zu tun? – musoNic80

+0

Ich denke, dass selected = "" immer noch diesen Wert auswählt, also müssen Sie diesen Parameter komplett für die nicht ausgewählten Optionen entfernen –

4

Dies ist, weil Sie $sel nie zurücksetzen.

Versuchen Sie stattdessen:

$sel = $perfTime == '19:30' ? 'selected' : ''; 
0

$sel ist überall nicht explizit intitialised, so dass es für jeden laufen durch die Schleife seine ‚ausgewählt‘ Wert beibehalten wird.

Versuchen Sie $sel = ""; als die erste Zeile in Ihrer Schleife als eine schnelle Lösung.

0

Hm, könnte sein, dass Sie das tun sollten:

... 
if ($perfTime == '19:30') { 
    $sel = 'selected="selected"'; 
}else{ 
    $sel = ""; 
} 
... 

Ich denke nur, die ‚ausgewählt‘ vorhanden Attribut macht es ausgewählt.

Oops, ich vergaß: Und

echo '<option value="'. $perfTimeNumber .'" '.$sel.'>' .$perfTime .'</option>'; 
+0

Gerade versucht, dass, obwohl es jetzt nur um 19:30 Uhr hinzugefügt wird, das Menü nicht standardmäßig 19:30 ist. Noch mehr Ideen? – musoNic80

Verwandte Themen