PHP while循环问题

4

我主要是CSS和HTML方面的人,但最近开始涉足PHP。

我不明白为什么这个脚本会卡住:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    $loop_Until = $loop_Until + 1;
}

有人能帮忙吗?


你期望的范围是什么? - Adrian Godong
4个回答

18

修复后的代码

$loop_Until = 10;
$i = 0;

    while($i < $loop_Until)
    {
        // do some code here
        $i = $i + 1;
    }

您代码的解释:

// A variable called loop until is set to 10
$loop_Until = 10;  

// While the variable i is less than 10
// NOTE:  i is not set in code snippet, so we have no way of knowing what value it is, if it is greater than 10 it might be infinite
while($i < $loop_Until)
{
    // Increment the 10 value up 1 every time, i never changes!
    $loop_Until = $loop_Until + 1;
}

3
采用原始的while循环结构,而非将其改写为for循环,值得点赞。 - danp
1
+1 对于他最初代码的解释 - 了解为什么某些东西不能按预期工作总是很有帮助的。 - user353297
1
@danp:这有什么好的……怎么样算是好呢?idio说他们之前只用过HTML和CSS,可能不知道for循环,而这是正确的循环计数结构。 - Powerlord
没有假设,OP询问while,最好以此为前提回复。说“顺便说一下...for可以这样做”没有问题,但要保持上下文的连贯性 :) - danp

11

这会导致无限循环,您需要查看PHP的for循环。http://php.net/manual/en/control-structures.for.php

for($i= 1; $i< $loop_Until; ++$i) {
    // do some code here
}

你每次都在增加 $loop_Until,但没有增加 $i,因此 $i 将永远小于 $loop_Until


1

最简单的解决方案:将“+”替换为“-”。这将导致循环结束。像这样:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    $loop_Until = $loop_Until - 1;
}

让我解释一下,提供一个稍微更好的解决方案,并给你几个替代方案。

如果我们假设 $i 开始时比 $loop_Until 小,那么使用代码行 $loop_Until = $loop_Until + 1; 增加 $loop_Until 的值永远不会使得 $i 等于或大于 $loop_Until。

你应该从 $loop_Until 减去一个数,或者给 $i 加上一个数。

通过执行 --$variable 可以快速地从一个变量中减去 1。 通过执行 ++$variable 可以快速地给一个变量加上 1,因此你应该这样写:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    --$loop_Until;
}

当然,$ loop_Until听起来像是你可能想要设置一次,然后让它保持不变的东西。 在这种情况下,您可以设置$i并递增它。 首先将 $i 设置为您想要的任何值(如果您希望 while 循环至少运行一次,则应该小于$ loop_Until),然后执行以下操作:

$loop_Until = 10;

while($i < $loop_Until)
{
    // do some code here
    ++$i;
}

顺便提一下,++$i比$i++更快

正如Lizard所提到的,for循环非常适合做这件事。上面两个代码段的等效for循环如下:

for($loop_Until = 10; $i < $loop_Until; --$loop_Until)
{
    // do some code here
}

并且

for($loop_Until = 10; $i < $loop_Until; ++i)
{
    // do some code here
}

请确保您在纸上或脑海中使用几个数字检查您的条件最终会发生。

最后,您选择哪种解决方案将取决于您是否希望 $i 或 $loop_Until 保持不变。

如果您有多个循环,并且希望它们都执行相同的次数,则最好不要改变 $loop_Until,并在每个循环开始时重置 $i。


"++$i与$i++"是微观优化的绝佳例子。哇,似乎每次使用"++$i"而不是"$i++"可以节省整整0.6微秒! - el.pescado - нет войне
是的。养成这个习惯很好。可读性相同,击键次数相同,但你确实会产生微小的差异,所以你不妨...它还教你两者之间的区别,因为它们并不总是可以互换的(请参见TheBoss的答案)。 - Peter Ajtai

0

while( 0 != ($loop_until--) );

while( 0 != ($loop_until--) );

是一段编程代码,它的作用是在$loop_until变量递减至0之前不断循环执行代码块。

1
为什么你假设0是一个有意义的数字。OP想要与$i进行比较...另外,如果你想要与0进行比较,为什么不使用while($loop_until--)呢? - Peter Ajtai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接