2013-11-23 2 views
0

Я использую следующий, в основном печатает выпадающий список с указанием всех часов с шагом 30 минут:PHP сброс While() цикл

$start = '12:00AM'; 
$end = '11:59PM'; 
$interval = '+30 minutes'; 

$start_str = strtotime($start); 
$end_str = strtotime($end); 
$now_str = $start_str; 

echo '<select name="doors_open">'; 

while($now_str <= $end_str){ 
    echo '<option value="' . date('h:i A', $now_str) . '">' . date('h:i A', $now_str) . '</option>'; 
    $now_str = strtotime($interval, $now_str); 
} 

echo '</select>'; 

НО, я хочу сделать это дважды для другого поля дальше вниз страница ... вопрос, как сбросить цикл?

Вот что я пытался, но не работает:

echo '<select name="event_start">'; 

reset($now_str); 
reset($end_str); 
while($now_str <= $end_str){ 
    echo '<option value="' . date('h:i A', $now_str) . '">' . date('h:i A', $now_str) . '</option>'; 
    $now_str = strtotime($interval, $now_str); 
} 

echo '</select>'; 

ответ

2

reset() сбрасывает внутренний курсор массива. Это совершенно другая вещь, которую вы хотите достичь.

Вы можете, конечно, просто дублировать код, но это ни хороший дизайн кода, ни DRY.

Лучшее, что вы можете сделать, это положить поколение HTML весь во вспомогательную функцию:

function genSelect($selectName, $start, $end, $interval) { 
    $str = "<select name='$selectName'>"; 

    $start_str = strtotime($start); 
    $end_str = strtotime($end); 
    $now_str = $start_str; 


    while($now_str <= $end_str){ 
    $str .= '<option value="' . date('h:i A', $now_str) . '">' . date('h:i A', $now_str) . '</option>'; 
    $now_str = strtotime($interval, $now_str); 
    } 

    $str .= '</select>'; 
    return $str; 
} 

Затем, вы можете назвать это так часто, как вы хотите:

echo genSelect('doors_open', '12:00AM', '11:59PM', '+30 minutes'); 

Вы можете также рассмотрите вопрос о кешировании результата:

$doorsOpenHtml = genSelect('doors_open', '12:00AM', '11:59PM', '+30 minutes'); 
+0

Придется добавить еще одну переменную в функцию, иначе все бы имели такое же имя –

+0

@DarrenSweeney Я добавил один. – ComFreek

+0

Большое спасибо! Есть ли причина возвращать $ str, а затем эхо-функцию, а не echo $ str внутри функции, а затем просто вызвать функцию без эха? Просто любопытно –

3

В вашем случае вам просто нужно переназначить начальное значение на $now_str, чтобы ваша петля снова могла работать. Поскольку ваша переменная $start_str содержит ее, вы можете просто переназначить ее до $now_str после первого цикла.

$now_str = $start_str; 

reset функция фактически сбрасывает внутренний указатель массива используется для петель, который не в данном случае.

Примечание: Я рекомендую использовать вспомогательную функцию, поскольку @ComFreek рекомендуется избегать повторения кода.

+0

@ComFreek Мне очень жаль, что вы так ошибались, как это, хахаха. Это было не предложение. –

+0

Нет проблем, что случается довольно часто;) – ComFreek

Смежные вопросы