【问题标题】:While Loop not Breaking when Condition is Met满足条件时循环不中断
【发布时间】:2014-04-30 05:26:58
【问题描述】:

我的函数中有几个正在工作的 while 循环,但这一个我无法按预期工作。我假设while($variable == false) 会在$variable = true; 发生后立即跳出循环。这是一个简单的版本,循环内只有两个语句。

$excluded = false;
while($excluded == false):
    $excluded = in_array(strtolower($extension), $GLOBALS['codexts']) ? true : false;
    $excluded = $file != "." && $file != ".." ? false : true; 
    break;
endwhile;

在循环内部,第一个定义确实会产生false,但循环不会中断。它继续到第二个,它返回 true。如果我将第二个更改为:

$excluded = $excluded ? $excluded : ($file != "." && $file != ".." ? false : true); 

...然后我得到了我想要的结果,但这仅仅是因为我正在纠正当 $excluded 首次定义为 true 时 while 循环中断的失败。我在这里做错了什么?

更新 我刚刚重读了手册,显然我错过了这一部分:

每次循环开始时都会检查表达式的值,因此即使在执行嵌套语句期间该值发生变化,执行也不会停止,直到迭代结束

这就是迭代恢复为 false 的原因。毕竟我确实需要手动条件中断。

【问题讨论】:

  • 你确定它会进入第二个循环吗?您的break; 语句没有围绕它的条件,无论您的$excluded 是真还是假,它都会执行。
  • 缺少大括号.....
  • break 语句位于循环的末尾,用于覆盖那些永远不会返回 true 的迭代,因此循环不会卡住。但我向你保证,有些迭代在第一个语句中返回 true,但表现得不像它们是 true,因此我知道它会继续到第二个语句。最后的休息不是问题。
  • 不,缺少大括号不是问题。

标签: php while-loop


【解决方案1】:

试试

$excluded = false;
while($excluded == false) {
   $excluded = in_array(strtolower($extension), $GLOBALS['codexts']) ? true : false;
   if ($excluded == true) {
     break;
   }
    $excluded = $file != "." && $file != ".." ? false : true; 
    break;
} 
?>

【讨论】:

  • 我花了一分钟才知道有什么不同。大括号。嗯,我试过了。还是行不通。不过还是谢谢。
  • @Thom:如果第一个语句为真,是否需要中断 while 循环??
  • 是的。这就是 while 循环应该做的事情。条件改变时中断。
  • 我不应该使用 break。当条件改变时,While 循环应该中断。他们就是这样做的。
  • @Thom 没错,您的情况下不需要break;。一个关键点是,您的循环中没有任何变化,因此根据您的值,它可能会执行一次或无限次。
【解决方案2】:

问:为什么不使用常规语法?

问:为什么会有多余的“中断”?

问:为什么在测试之前要设置两次表达式,这里真的需要“?:”吗?两次???

问:你不能简化改变标志的表达式(改变“$excluded”)吗?

建议:

$myvar = false;
while(!$myvar) {
  $myvar = << something that sets/clears my flag >>
}

【讨论】:

  • 问:我的语法中哪一部分是非常规的? A:break 语句在循环的末尾,用来覆盖那些永远不会返回 true 的迭代,所以循环不会卡住。这是标准协议。它不是多余的。问:我不明白你的第三个问题:“在测试之前设置表达式两次。”
  • 没有比if in_array() true/false简单多少了。
  • 你的建议正是我已经在做的。 !$myvar$myvar == false是一样的,我试过!$excluded很多次才发到这里。
  • 使用 $myvar 的包装值作为您的 while while !$myvar.wrappedValue {
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2017-08-01
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多