2013-11-23 74 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()重置數組的內部指針。這是完全不同的事情比你想實現。

你當然可以簡單地複製代碼,但這既不是好的代碼設計,也不是幹。

你能做的最好是把整個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