PHPでループを「終了」できますか?


118

PHPコードでエラーチェックを実行しているループがあります。もともとはこのようなものでした...

foreach($results as $result) {
    if (!$condition) {
        $halt = true;
        ErrorHandler::addErrorToStack('Unexpected result.');
    }

    doSomething();
 }

if (!$halt) {
    // do what I want cos I know there was no error
}

これはすべてうまく機能しますが、1つのエラーが発生した後でも、ループする必要はありません。ループを脱出する方法はありますか?

回答:


211

あなたはbreakステートメントを探しています。

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list(, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}

13
@Gabriel、それは質問に答えます、コードサンプルはまさにそれ、サンプルです。わかりにくい "$ arr"配列名について不満を言うかもしれません。
paxdiablo 2009

5
@Gabriel:PHPマニュアルで直接参照されているコードを投稿していますが、breakステートメントの使用法を正確に示しています。
TheTXI 2009

@Pax、私にとってそれは主観的なものです。例を挙げるたびに、実際のコードを書き込もうとしました。
ガブリエル・ソーサ、

1
@Gabriel:あなたは例をまったく投稿しなかった、そしてあなたが与えたリンクは私が提供したものと全く同じソースに行く(それはサンプルコードが一番上から来るところである)。基本的に私と同じことをしましたが、OPがリンクをクリックするまでOPがサンプルを見られないようにしました。
TheTXI 2009

3
しかし、それループする奇妙な方法です!
alex

151

他の投稿で述べたように、breakキーワードを使用できます。ほのめかされたが説明されていないことの1つは、キーワードが数値を取り、PHPにいくつのレベルから分割するかを指示できることです。

たとえば、3つのforeachループが互いに入れ子になっていて、情報の一部を見つけようとしている場合、 'break 3'を実行すると、3つすべての入れ子のループから抜け出すことができます。これは、「for」、「foreach」、「while」、「do-while」、または「switch」構造で機能します。

$person = "Rasmus Lerdorf";
$found = false;

foreach($organization as $oKey=>$department)
{
   foreach($department as $dKey=>$group)
   {
      foreach($group as $gKey=>$employee)
      {
         if ($employee['fullname'] == $person)
         {
            $found = true;
            break 3;
         }
      } // group
   } // department
} // organization

5
いい視点ね。それは上部のPHPマニュアルでかなり明確に説明されています。これがこの特定の質問にとって必須であるとは思いませんが、これはまだ知っておくととても良いです。+1
TheTXI 2009

46

break; あなたのループを残します。

continue; 条件がまだ真である限り、そのループの残りの部分のコードをスキップし、次のループに進みます。


ちょうど私が必要とするもの..現在のループのみを中断し、breakのようにループ全体を残さないために、「継続」します。
K.キリアンリンドバーグ


4

これらはすべて良い答えですが、より良いコード標準であると私が思うもう1つを提案したいと思います。ループを継続するかどうかを示すフラグをループ条件で使用して、breakすべてを一緒に使用しないようにすることもできます。

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
$length = count($arr);
$found = false;
for ($i = 0; $i < $length && !$found; $i++) {
    $val = $arr[$i];
    if ($val == 'stop') {
        $found = true; // this will cause the code to 
                       // stop looping the next time 
                       // the condition is checked
    }
    echo "$val<br />\n";
}

これbreakは、使用されるスコープに依存しないため、より良いコードプラクティスであると私は考えています。むしろ、特定のループを中断するかどうかを示す変数を定義します。これは、ネストされているか連続していないループが多数ある場合に役立ちます。


3
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.