【问题标题】:why isn't this php loop working?为什么这个 php 循环不起作用?
【发布时间】:2010-10-29 07:43:41
【问题描述】:

我有这个代码:

$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。我做错了什么?

【问题讨论】:

  • 以后源代码请使用code markdown代替HTML代码标签。尝试编辑器中的相应按钮或将代码块缩进四个空格,并用反引号 (`) 包围内联代码。

标签: php for-loop if-statement


【解决方案1】:

嗯,也许你应该这样做:

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

我认为只要存在 'selected' 属性就可以使其被选中。

糟糕,我忘了:还有

 echo '<option value="'. $perfTimeNumber .'" '.$sel.'>' .$perfTime .'</option>';

【讨论】:

  • 刚刚试了一下,虽然现在只添加到 19:30,但菜单并没有默认为 19:30。还有什么想法吗?
【解决方案2】:

$sel 没有在任何地方显式初始化,因此它在每次循环运行时都保持其“选定”值。

尝试将$sel = ""; 作为循环中的第一行作为快速修复。

【讨论】:

    【解决方案3】:

    这是因为您从未重置 $sel

    试试这个:

    $sel = $perfTime == '19:30' ? 'selected' : '';
    

    【讨论】:

      【解决方案4】:

      简短回答:因为每个回显操作都使用 $sel 的当前值。我假设它最初是空白的,所以前 N 个回声包含 selected=''。如果测试成功,$sel 被设置为“selected”,之后的每一次打印都包含 selected='selected'。如果你使用 $perfTime = '19:30',它是一个赋值,所以测试总是成功,并且 $sel 总是被“选中”。

      快速修复:添加设置 $sel = '' 的 else 子句。但是,还有其他一些奇怪的东西让我认为这只是一个代码片段(即总是使用 $thisTime 作为 $perfTimestamp ,而不是循环索引的东西,所以它总是在同一时间打印?)。

      【讨论】:

      • 这是有道理的。知道这将是直截了当的!不过,这是一件奇怪的事情……我已经更改了代码以添加一个 else 子句,并且我可以通过查看源代码来判断现在正在选择 19:30。问题是选择菜单没有默认为该值!
      • Adam,你对 $thisTime 有什么顾虑?在开始循环之前,我将其初始化为凌晨 1 点。有更好的方法吗?
      • 我认为 selected="" 仍然会选择该值,因此您需要为未选择的选项完全删除该参数
      • 停止新闻!!!得到它的工作!不知道发生了什么变化,但它有效!即使我用 FnF5 刷新,我的浏览器可能仍在使用缓存版本!
      • @musoNic80:页面缓存与 UI 状态无关。您更有可能使用的是 Firefox,它会在刷新时保留 UI 状态以提供帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 2019-11-21
      相关资源
      最近更新 更多