ifとforeachから抜け出す


277

foreachループとifステートメントがあります。一致が見つかった場合、私は最終的にforeachから抜け出す必要があります。

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}

jsではなくphpの場合。私は彼らが同じように振る舞うとは思えません。
au_stan

6
gee-jQueryの使用を止める必要があります。なぜこれは反対票を投じたのですか?+1、完全に合理的で適切な質問。
mrtsherman

11
(何らかの理由で)php break docとその例に頭を抱えることができなかったため、私は質問をしました。しかし、すべて良い。バッジとポイントを獲得するためにここにいるわけではありません。
au_stan

回答:


609

if はループ構造ではないため、「それから抜け出す」ことはできません。

ただし、をforeach呼び出すだけでから抜け出すことができbreakます。あなたの例では、それは望ましい効果を持っています:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

答えを探してこの質問に出くわした他の人のための完全さのために。

breakオプションの引数を取ります。これは、いくつのループ構造を解除するを定義します。例:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

結果の出力:

1 3 2 1!


37
+1-経験の浅いプログラマーが時々苦労する何かのための素晴らしい例。
ジムD

1
お役に立ててありがとうございます。議論に言及するための余分なカルマ。ただし、if-loopはハックのようです。残りのステートメントを別のステートメントでラップしないのはなぜですか?あなたが役に立てるように努力していたことは知っていますが、初心者には注意してください。
Dan Barron

3
ここに着陸したが、includeステートメントを含むループから抜け出す方法を検索する場合は、continueではなくreturnを使用してください。
Nick Constantine

switchステートメントの場合はどうなりますか?switchステートメントも改行を使用します。誰かがスイッチの中に2つのブレークを置くだけでしょうか。例{{case "break":echo 'break the switch and the loop'; 休憩;休憩; }?
Jevon

@Jevonいいえswitch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } 、単純に内側のbreak 2葉と両方のswitchステートメントを記述します。
魁夷

13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

単に使用しますbreak。それでうまくいきます。


そのため、ブレークはforeachからのブレークであり、ifからのブレークではありません。私の混乱は、if ($abort_if_block) break;私が最初に設定したこのステートメントによるものだと思いますが、break 2失敗しました。感謝
au_stan

2
ブレークコンストラクトに注意してください。を忘れた場合 その後、次の式の結果を取得し、予期しない動作を開始する可能性があります(IEが予想以上に飛び出します)。私は誰もがGOTOの使用に反対することを提案していることを知っていますが、ブレークを使用するよりも実際に上手くできないすべての場合に、gotoはより良いオプションになると思います。もちろん、フォワードジャンプ(遠すぎず)のみで、乱用はありません。;-)
maraspin

2

PHPでforeachor whileループを解除するより安全な方法ifは、元のループ内にインクリメントカウンター変数と条件付きをネストすることです。これにより、より厳密な制御が可能になりますbreak;、複雑なページの他の場所で大混乱を引き起こす可能性がある可能になります。

例:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;

構文が正しくありません。endwhileステートメントを使用したい場合は、書く必要がありますwhile (..): ...; endwhile;-後のコロンに注意してくださいwhile
魁夷

0

ここに着陸したが、includeステートメントを含むループから抜け出す方法を検索する場合は、breakまたはcontinueではなくreturnを使用してください。

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

do_this_for_even.phpの中にいるときに中断したい場合は、returnを使用する必要があります。中断または続行を使用すると、次のエラーが返されます。1レベルを中断または続行できません。詳細はこちら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.