【问题标题】:When to use 'Break' in For loop?何时在 For 循环中使用“Break”?
【发布时间】:2017-02-02 02:48:15
【问题描述】:

我有不同的页面,每个页面都包含一些数组,

例如:

第 1 页仅包含 2 个数组:

$textual_button[1] = "I am a long character";
$textual_button[2] = "I am also a long character";

第 2 页包含 20 个数组:

$textual_button[1] = "I am a long character";
...
...
$textual_button[19] = "I am also a long character";
$textual_button[20] = "I am also a very long character";

因此,我想检查前 15 个数组中的某个条件(可能存在 - 如第 2 页,也可能不存在 - 如第 1 页,仅包含 2 个)

我想应用一些名为 smallbig 的样式类,或者根本没有类,这取决于两个条件:

  1. 默认不设置任何类。

  2. 如果数组中存在图像,请检查前 15 个数组的字符串长度。 如果它们都短于 11 个字符,则设置一个 big 类。否则,设置一个small 类。

  3. 无论图像是否存在,如果前 15 个数组中至少有一个数组包含 14 个或更多字符,则设置一个 small 类(如果已设置则覆盖 big 类早)

这是代码,我不确定何时以及如何使用break

$class = "nothing"; //default class

if (in_array(true, $image)) { // If there's any image in array :

    $class = "small"; // by default, apply small class 

        for($x = 1;$x <= 15;$x++){  // check on array 1 to 15
            if (strlen((string)$textual_button[$x]) <= 11) {  // if all textual string are  less or equal to 11 characters , make them big
            $class = "big";  
            };
        break; // Is this necessary?
        } 
}

 // In general, no matter if there's an image in array:

for($x = 1;$x <= 15;$x++){  // check on array 1 to 15
    if (strlen((string)$textual_button[$x]) >= 14) {  // if even one textual string is 14 or more, make all of them small.
      $class = "small";
    };
    break; // When is it necessary?
}

【问题讨论】:

    标签: php loops for-loop conditional break


    【解决方案1】:

    你的意思是这样的吗?

    <?php
    
        $class      = "nothing"; 
        if (in_array(true, $image)) {    
            $class  = "small"; 
            for($x = 1;$x <= 15;$x++){  
                if (strlen( (string)$textual_button[$x] ) <= 11) { 
                    $class = "big";
                    // BREAK OUT OF THE LOOP INSIDE THE IF CLAUSE SINCE YOU HAVE REACHED YOUR GOAL
                    // WHICH IS : THE LENGTH OF $textual_button[$x] IS LESS THAN OR EQUAL TO 11  
                    break;
                }else{
                    // NO NEED FOR AN EXTRA LOOP SINCE IT IS ESSENTIALLY THE SAME LOOP
                    // JUST DO WHATEVER YOU WISH WITHIN THE ELSE CLAUSE...
                    // THAT IS IF: THE LENGTH OF $textual_button[$x] IS GREATER THAN OR EQUAL TO 14  
                    // AGAIN BREAK OUT OF THE LOOP INSIDE THE ELSE CLAUSE SINCE YOU HAVE REACHED YOUR GOAL
                    $class = "small";   
                    break;             
                }             
            }
        }
    

    还是这样的?

        $class      = "nothing";
        if (in_array(true, $image)) {
            $class  = "small";
            for($x = 1;$x <= 15;$x++){
                if (strlen( (string)$textual_button[$x] ) <= 11) {
                    $class = "big";
                    // BREAK OUT OF THE LOOP INSIDE THE IF CLAUSE SINCE YOU HAVE REACHED YOUR GOAL
                    // WHICH IS : THE LENGTH OF $textual_button[$x] IS LESS THAN OR EQUAL TO 11
                    break;
                }
            }
        }
    
        for($x = 1;$x <= 15;$x++){  // check on array 1 to 15
            if (strlen( (string)$textual_button[$x]) >= 14 ) {
                // AGAIN BREAK OUT OF THE LOOP INSIDE THE ELSE CLAUSE SINCE YOU HAVE REACHED YOUR GOAL
                // THAT IS IF: THE LENGTH OF $textual_button[$x] IS GREATER THAN OR EQUAL TO 14
                $class = "small";
                break;
            };
        }
    

    【讨论】:

      【解决方案2】:

      break 会跳出循环,因此在这两种情况下,您的循环只会运行一次,或第一次迭代,然后停止。

      所以不,您不应该在这里使用break,因为您已经将迭代次数限制为 15。

      break 可能很有用(还有其他方法...)如果您循环遍历数组中的 所有 元素,请保留一个计数器,然后检查计数器是否为 15 以突破循环。

      请注意,您可能需要一个 foreach 循环而不是 for 循环,因为当您的数组中的元素少于 15 个时,具有 15 次迭代的 for 循环将导致 php 警告。

      在您的情况下,我个人会做的是将数组分割为最多 15 个元素(当元素较少时会减少...),然后再分割为 foreach

      最后一件事:你在循环中覆盖了你的$class 变量,所以它可能不会像你期望的那样做。如果任何元素不满足您的条件,您可能应该将布尔值设置为false,然后根据该布尔值设置类循环之后。

      一般来说,如果any需要匹配,你可以使用break,但是如果all需要匹配,你总是需要结束循环。

      【讨论】:

      • 在第 1 页(有 2 个数组)上,当我不使用 break 时,设置了 big 类,即使所有数组都超过 11 个字符。所以我认为可能是因为它正在尝试检查不存在的数组(3-15),并且由于它不存在,因此长度被认为是0,它适用于大类。所以我认为 break 会检查条件是否至少满足一次,然后避免再次运行循环。那么在满足条件时停止或不停止在哪里适合?我仍然很困惑。如何从头开始?
      • 如何计算数组的数量以减少数组的数量?另外,break是否意味着当第一次满足条件时,循环将结束?或者它与break无关。它与foreach有关吗?
      • @rockyraw 只需使用array_slice($arr, 0, 15) 并使用foreach 循环。
      • 我不明白。如果 break 总是打破循环,那么为什么有人要使用带有 break 的循环,如果它不是真的要循环呢?
      • @rockyraw 就像我说的,如果你在循环中测试并且 any 需要匹配,你可以在找到匹配项后立即中断。
      【解决方案3】:

      在这两种情况下,只会发生一次for 循环,因为您在不检查任何内容的情况下就破坏了它。如果要检查是否所有数组元素都符合条件,则应将break 放在if 内条件:

      for ($x = 1; $x <= 15; $x++) {
          if (strlen((string)$textual_button[$x]) <= 11) {
              $class = "big";
              break;  
          };
       }
      

      在这种情况下,如果数组中的任何元素短于 11 个符号,$class 将变为big 并且for 循环将停止执行。如果您像第一个示例一样更改代码,第二个for 也是如此。

      【讨论】:

        【解决方案4】:

        不妨试试这个

        $class = "nothing"; //default class
        
        if (in_array(true, $image)) { // If there's any image in array :
        
            $class = "small"; // by default, apply small class 
        
                for($x = 1;$x <= 15;$x++){  // check on array 1 to 15
                    if (strlen((string)$textual_button[$x]) <= 11) {  // if all textual string are  less or equal to 11 characters , make them big
                    $class = "big";
                    };
                    else {
                    $class = "small";
                    break;
                    }
                } 
        }
        
         // In general, no matter if there's an image in array:
        
        for($x = 1;$x <= 15;$x++){  // check on array 1 to 15
            if (strlen((string)$textual_button[$x]) >= 14) {  // if even one textual string is 14 or more, make all of them small.
              $class = "small";
              break;
            };
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-09
          • 1970-01-01
          • 1970-01-01
          • 2020-07-11
          • 2017-11-02
          • 1970-01-01
          • 1970-01-01
          • 2014-03-07
          相关资源
          最近更新 更多