2013-11-23 43 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