web-dev-qa-db-ja.com

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

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つ発生しても不要であるにもかかわらず、ループし続けています。ループをエスケープする方法はありますか?

108
alex

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";
}
186
TheTXI

他の投稿で述べたように、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
144
William Holroyd

break;はループを抜けます。

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

43
Hans

break を使用します

5
Gabriel Sosa
$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";
}
3
Piseth Sok

これらはすべて良い答えですが、より良いコード標準であると私が感じるもう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