PHP重置while()循环

时间:2013-11-23 17:23:42

标签: php while-loop

我使用以下内容基本上打印一个下拉框,显示所有小时,增量为30分钟:

$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 个答案:

答案 0 :(得分:3)

在您的情况下,您只需将初始值重新分配给$now_str,这样您的循环就可以再次运行。由于您的$start_str变量包含它,您可以在第一次循环后将其重新分配给$now_str

$now_str = $start_str;

reset函数实际上重置了一个用于循环的数组内部指针,这不是这里的情况。

注意:我建议使用辅助函数作为@ComFreek,以避免重复代码。

答案 1 :(得分: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');