【PHP】foreachをbreakで途中終了する方法|continueとの違い・多重ループとswitchの注意

foreachで配列を処理しているとき、目的の要素が見つかったらそこで処理を打ち切りたいことがあります。そんなときは break 文を使います。この記事では基本の使い方に加え、continue との違い、多重ループを一気に抜ける break 2、そしてswitch文の中での break の落とし穴まで解説します。

この記事の結論:breakループ自体を終了します。次の要素へスキップしたいだけなら continue です。入れ子のループをまとめて抜けるには break 2 のように数値を付けます。
スポンサーリンク

breakでループを途中終了する

条件を満たしたところで break を実行すると、それ以降の要素は処理されずループが終わります。

指定の値が見つかったら終了
<?php
$fruits = ["apple", "banana", "orange", "grape", "peach"];

foreach ($fruits as $fruit) {
    if ($fruit === "orange") {
        echo "orange を発見、ループ終了\n";
        break; // ここでループを抜ける
    }
    echo "確認中: $fruit\n";
}
echo "ループ終了後の処理\n";
// 出力: apple, banana を確認 → orange発見で終了(grape/peach は処理されない)

breakとcontinueの違い

よく混同されますが、break はループ自体を終了continue はその回だけ飛ばして次の要素へ進む、という違いがあります。

動作
break ループを終了し、ループの後ろへ抜ける
continue 今回の処理を中断し、次の繰り返しへ進む
「特定の要素だけ飛ばして処理を続けたい」場合は continue を使います。詳しくはforeachループをcontinueでスキップする方法を参照してください。

多重ループをまとめて抜ける(break N)

break現在のループ1つだけを終了します。入れ子になったループを外側まとめて抜けたい場合は、break 2 のように抜けたい階層の数を指定します。

break 2 で二重ループを脱出
<?php
foreach (["a", "b"] as $x) {
    foreach ([1, 2, 3] as $y) {
        if ($y === 2) {
            echo "$x-$y で二重ループを脱出\n";
            break 2; // 内側・外側の両方を抜ける
        }
        echo "$x-$y\n";
    }
}
echo "完了\n";
// 出力: a-1 → a-2 で break 2 → 完了(b は処理されない)
break(=break 1)は内側のループだけを抜けます。break 2 は内側と外側の2階層を抜けます。抜けたいループの数に合わせて数値を指定してください。

注意:switchの中のbreakはループを抜けない

意外な落とし穴が、ループの中で switch を使っているケースです。PHPでは switchbreak の対象になるため、switch 内の breakswitchを抜けるだけでループは続きます

switch内のbreakはループを止めない
<?php
foreach ([1, 2, 3, 4, 5] as $n) {
    switch ($n) {
        case 3:
            echo "3 で break\n";
            break; // ← switch を抜けるだけ。ループは続く
        default:
            echo "n=$n\n";
    }
}
// 出力: n=1, n=2, 3でbreak, n=4, n=5(ループは止まらない)
switch内からループを抜けたいときは break 2 を使います。switch が1階層、foreach が2階層目とカウントされるためです。この挙動を知らないと「breakしたのにループが止まらない」とハマりやすいので注意してください。

よくある質問(FAQ)

Qbreakとcontinueはどう違いますか?
Abreak はループ自体を終了してループの後ろへ進みます。continue は今回の繰り返しだけを飛ばして次の要素へ進みます。ループを止めるか、飛ばして続けるかの違いです。
Q入れ子のforeachを一度に抜けるには?
Abreak 2 のように、抜けたいループの階層数を指定します。break だけ(break 1)では一番内側のループしか抜けません。
Qbreakしたのにループが止まりません。
Aループの中で switch を使っていませんか。switch 内の breakswitchを抜けるだけです。ループも抜けるには break 2 を使ってください。
Qbreak は for や while でも使えますか?
A使えます。breakforwhiledo-whileforeachswitch のいずれでも使えます。各ループの基本はループ処理を行う方法を参照してください。

まとめ

PHPのforeachをbreakで終了するポイントを整理します。

  • breakループ自体を終了する
  • 飛ばして続けたいだけなら continue
  • 入れ子のループは break 2 でまとめて抜ける
  • switch内の break はループを抜けないbreak 2 が必要)
  • break は for・while・do-while でも同様に使える

関連として、continueでスキップする方法foreachで配列を順番に操作する方法do-while文でループ処理を行う方法もあわせて読むと、PHPのループ制御に強くなれます。