如果为true,则中断第一个循环并继续下一个循环


Break first loop and continue next loop if true

我在另一个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

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

目标

我使用的数组可能很大,我一直在研究breakcontinue命令,试图跳过不必要的部分来改进代码,并使脚本运行更少的循环。

正如您所看到的,如果内部foreach的循环导致$status=false,那么我们可以立即停止它(这里不需要进一步的循环)。CCD_ 16有利于跳过其余的CCD_ 17循环。

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

问题

我一直在查看命令行break 2continue 2,例如,它们允许您跳过当前and外部循环(向上两步)及其各自的结果(要么完全停止循环,要么跳过当前循环的其余部分)。它们分别作为"break break"answers"continue continue"的双重中断工作。

但如果你明白我的意思的话,我需要break continue这样的东西。第一个循环应该是break,下一个循环应该continue。如果没有必要,我会尽量避免在代码中使用if语句。检查已经完成,感觉像是在做一次不必要的复查。

我希望问题是清楚的。是否有一种方法可以从内部foreach中进行双重跳过,但会受到两个不同命令break continue的影响?

"Flag"变量大多是一种代码气味,表明您实际上应该使用一个函数:

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:
}

只需使用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
foreach($array1 as $uid => $somevalues) {
   // Task of loop 1
   foreach($somevalues as $somevalue){
      // Task of loop 2
      if(!isset($somevalue->$someothervalue))
          {
            continue 2;
            break;
          }
     }
}