断开第一个循环并继续下一个循环,如果为真

时间:2014-09-13 10:29:32

标签: php loops foreach break continue

我在另一个foreach循环中有一个foreach循环,代码如下:

foreach($array1 as $uid => $somevalues) {

  $status = true;
  foreach($somevalues as $somevalue)
    if(!isset($somevalue->$someothervalue))
      $status = false;

  if($status) {
    $content .= "some content added";
    $count++;
  }
}

工作原理

如您所见,我正在遍历$array1中的所有条目。对于每个条目,我遍历包含的$somevalues数组以查找某个条件(那里存在$someothervalue)。现在,如果此条件(某些内容isset)不正确,则$status会更改为false

只有在内部$status的所有循环之后foreach仍然为真时,我希望进行一些操作(一些内容添加到文本字符串$content和一个凸起的计数器)。

目标

我正在使用的数组可能非常大,我一直在查看breakcontinue命令,试图跳过不必要的部分来改进代码并让脚本运行更少环路。

正如您所看到的,如果来自内部foreach的循环导致$status=false,那么我们可以将其停在那里(此处不需要进一步的循环)。 break有助于跳过剩余的forearch循环。

如果是这种情况,那么我们也可以从外部foreach跳过当前外部循环的其余部分,因为现在$status false不会运行任何代码。为此,continue命令对于让我们跳过当前外部循环的其余部分并立即转到下一个数组行非常有用。

问题

我一直在查看命令行break 2continue 2,例如让你跳过当前和外部循环(两步)以及它们各自的结果(完全停止循环或跳过当前循环的其余部分)。它们分别作为双重休息 - 作为“break break” - 以及双重继续 - 作为“continue continue”。

但是,如果你明白我的话,我需要break continue这样的东西。第一个循环应为break,下一个应为continue。我试图避免在没有必要的情况下到达代码中的if语句。检查已经完成,感觉就像做了不必要的仔细检查。

我希望问题很清楚。有没有一种方法可以在内部foreach内双重跳过,但是有两个不同命令的作用break continue

3 个答案:

答案 0 :(得分:2)

"标志"变量主要是代码气味,并且表明您实际应该使用函数:

function all_valid($somevalues) {
    foreach($somevalues as $somevalue)
       if(!isset($somevalue->$someothervalue))
           return false;
    return true;
}


foreach($array1 as $uid => $somevalues) {
    if(all_valid($somevalues) {
        do stuff

如果您准备牺牲性能的可读性,那么如何:

foreach($array1 as $uid => $somevalues) {

    foreach($somevalues as $somevalue)
        if(!isset($somevalue->$someothervalue))
            goto next; // I don't believe I wrote this

    $content .= "some content added";
    $count++;

    next:
}

答案 1 :(得分:1)

只需使用continue 2,它将在第一个循环中“break”,并在外部循环中continue

foreach([1, 2, 3] as $i) {
    echo $i . PHP_EOL;

    foreach([4, 5, 6] as $ii) {
        continue 2;
    }

    echo 'this will never print' . PHP_EOL;
}

将打印:

1
2
3

答案 2 :(得分:1)

foreach($array1 as $uid => $somevalues) {
   // Task of loop 1
   foreach($somevalues as $somevalue){
      // Task of loop 2
      if(!isset($somevalue->$someothervalue))
          {
            continue 2;
            break;
          }
     }
}