代码之家  ›  专栏  ›  技术社区  ›  JeremyE

While循环内的If循环导致无限循环

php
  •  0
  • JeremyE  · 技术社区  · 6 年前

    我试图遍历数组中包含特定值的前5项。

    下面的代码将导致无限循环。

    $i = 0;
    while ($i < 5):
        if ($counselor[$i]->state == $state || !$state): 
           // do stuff
           $i++; 
        endif;
    endwhile;
    

    7 回复  |  直到 6 年前
        1
  •  4
  •   Qirel    6 年前

    虽然其他人已经解释了为什么您的解决方案目前不起作用,以及一些解决方法,但最好的选择是循环整个数组,直到找到5个匹配项为止—使用 foreach -而是循环。

    foreach公司

    $i = 0;
    // Loop the array
    foreach ($counselor as $k=>$v) {
        // Check if there is a match
        if ($v->state == $state || !$state) {
            // Do whatever if a match here
            $i++;
        }
        // If we have found 5 matches, break out of the loop!
        if ($i == 5) {
            break;
        }
    }
    

    你现在可以看看有多大了 $i 是,如果少于5,则找到少于5个匹配项。如果正好是5,你找到了你的火柴,结束了循环。

        2
  •  2
  •   Toine H    6 年前

    如果不符合If语句,则您将只停留在检查 $counselor[0]->state

    当满足if语句时,您需要一个单独的计数器。

    $i = 0;
    $containsCount = 0;
    while ($containsCount < 5 || !isset($counselor[$i])):
    
        if ($counselor[$i]->state == $state || !$state):
            // do stuff
            ++$containsCount;   
        endif;
        ++$i;
    
    endwhile;
    

    我还添加了一个边界检查,检查$consulter[$I]是否为空。(也可以检查 $i < $arrayLength

        3
  •  1
  •   John T    6 年前

    如果您的If语句第一次为false($i=0),它将永远不会匹配…因为$i始终为0。对于$i=1、2、3或4也是如此。如果其中任何一个错误,循环将被阻塞。我永远不会增加。你需要另一个解决方案。

        4
  •  0
  •   Dirk Scholten    6 年前

    $i 仅当if语句返回true时。如果你把你的 $i++; 在if语句之外,循环将始终正好运行5次。

    $i = 0;
    while($i < 5):
    
        if($counselor[$i]->state == $state || !$state): 
           // do stuff
        endif;
        $i++; 
    
    endwhile;
    
        5
  •  0
  •   Jouby Wasim    6 年前

    你必须退出 $i++ 你的 if 条件:

    $i = 0;
    while($i < 5):
    
        if($counselor[$i]->state == $state || !$state): 
           // do stuff
        endif;
        $i++; 
    
    endwhile;
    
        6
  •  0
  •   noid    6 年前

    不要使用while语句,而是使用与数组长度匹配的循环,循环将在到达数组末尾时结束。

        7
  •  0
  •   Harsh Patel Sam    6 年前

    也许你可以试着像这样修改if语句:

    $i = 0;
    while($i < 5):
    
        if($counselor[$i++]->state == $state || !$state): 
           // do stuff
        endif;
    
    endwhile;