2009-02-26 16 views
94

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つのエラーが発生してもそれでもループしています。ループを脱出する方法はありますか?

答えて

158

あなたは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"; 
} 
+12

@Gabriel、それは質問に答える、コードサンプルはまさにサンプルです。あなたは、記述的でない "$ arr"配列名についても不平を言うかもしれません。 – paxdiablo

+5

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

+0

@Pax、私が主観的です、私が例を挙げるたびに、私は現実世界のコードを入れようとしました。 –

4

使用break

+0

他の人のコードにはいくつかの例がありましたが、foreachを使用していない場合はどうなりますか:P –

127

他の投稿に記載されているとおり、あなたはbreakキーワードを使用できます。ヒントをつけたが、説明されていないことの1つは、PHPがいくつのレベルから壊れるかを伝えるためにキーワードが数値をとることができるということです。

例えば、3つのforeachループをネストして情報を見つけようとすると、3つのネストされたループのすべてを抜けるために 'break 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 
+4

良い点。それは上のほうのPHPマニュアルでかなり明確に説明されています。私はこれがこの特定の質問のために不可欠ではないと思っていますが、これはまだ分かっています。 +1 – TheTXI

+7

+1ニース。私は今日何かを学んだ。 –

+2

+1良い点!非常に明確な説明... – Mirko

38

break;あなたのループを去ります。

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

+2

thxは継続のリマインダです。 –

+0

ちょうど私が必要とする..現在のループだけを破って、ループ全体を休憩として残さないために "続ける"こと。 –

1
$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

この正確なコードは5年前に投稿されました..なぜそれを再度投稿しますか? – alex

+3

私はちょうどそれを見やすくするためにforeachを使いました。 @alex –

-1

私はcssで解決策を試しましたが、私のために働くことができませんでした。

href="#"href="javascript:void(0);"に変更すると、この場合のモーダルは上にジャンプせず、イベントエレメントの位置にとどまります。

+0

これは関連性がないようです –

1

これらはすべて良い回答ですが、私はより良いコード標準だと感じていることをもう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が使用されていることをスコープに依存しないので、私は、これはより良いコードの練習であると考えています。むしろ、特定のループを解除するかどうかを示す変数を定義します。これは、ネストされていてもシーケンシャルでなくてもよいループが多数ある場合に便利です。

関連する問題