почему не работает этот php цикл? - PullRequest
0 голосов
/ 27 мая 2009

У меня есть этот код:

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

Это прекрасно работает для генерации выбранного входа с параметрами от 01:00 до 24:45 с 15-минутными интервалами. Однако, если я изменю код и добавлю оператор if, я получу странные результаты ...

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

Идея состоит в том, чтобы (произвольно!) Сделать выбор по умолчанию 19.30. Код выше добавляет
selected = "selected" для каждой опции после 19:30, а не только для опции 19:30. Если я слегка изменю оператор if на if ($perfTime = '19:30') { ..., то есть, имея один = вместо ==, он создаст набор параметров со значением 19:30. Что я делаю не так?

Ответы [ 4 ]

5 голосов
/ 27 мая 2009

Краткий ответ: потому что каждая операция эха использует текущее значение $ sel. Я предполагаю, что изначально он пуст, поэтому первые N echos содержат selected = ''. Если тест пройден успешно, $ sel устанавливается в «selected», и каждая последующая печать включает selected = 'selected'. Если вы используете $ perfTime = '19: 30 ', это назначение, поэтому тест всегда проходит успешно, а $ sel всегда' выбран '.

Быстрое исправление: добавьте предложение else, которое устанавливает $ sel = ''. Однако есть и другие странности, которые заставляют меня думать, что это всего лишь фрагмент кода (т. Е. Всегда используется $ thisTime для $ perfTimestamp, а не что-то с индексированным циклом, поэтому он всегда печатается в одно и то же время?).

4 голосов
/ 27 мая 2009

Это потому, что вы никогда не сбрасываете $sel.

Попробуйте вместо этого:

$sel = $perfTime == '19:30' ? 'selected' : '';
0 голосов
/ 27 мая 2009

Хм, может быть, вы должны сделать это:

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

Я думаю, что наличие атрибута selected делает его выделенным.

Ой, я забыл: И

 echo '<option value="'. $perfTimeNumber .'" '.$sel.'>' .$perfTime .'</option>';
0 голосов
/ 27 мая 2009

$sel явно нигде не инициализирован, поэтому он поддерживает свое «выбранное» значение для каждого прохода через цикл.

Попробуйте $sel = ""; в качестве первой строки в вашем цикле для быстрого исправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...