PHPでforeachをbreakで抜ける方法について

採用はこちら

目次

PHPでforeachをbreakで抜ける方法

PHPでforeachループの処理を途中で終了したい場合は、break文を使用します。

breakが実行されると、その時点で現在のループを終了し、ループの後に書かれている処理へ進みます。

配列の中から特定の値を探す場合や、条件を満たした時点でそれ以上の処理が不要になる場合に便利です。

foreachでbreakを使う基本構文

基本的な書き方は次のとおりです。

foreach ($array as $value) {
    if ($condition) {
        break;
    }
}

たとえば、数値が3になった時点でforeachを終了する場合は、次のように記述します。

$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as $number) {
    echo $number . PHP_EOL;

    if ($number === 3) {
        break;
    }
}

実行結果は次のとおりです。

1
2
3

$number3になった時点でbreakが実行されるため、45は処理されません。

foreachでbreakを使う主な場面

breakは、すべての要素を最後まで処理する必要がない場合に役立ちます。

特に、検索処理や条件判定との相性が良い命令です。

特定の値が見つかったら終了する

配列の中から特定の値を探し、見つかった時点で処理を終了できます。

$users = ['田中', '佐藤', '鈴木', '高橋'];

foreach ($users as $user) {
    if ($user === '鈴木') {
        echo '鈴木さんが見つかりました。';
        break;
    }
}

「鈴木」が見つかった時点でforeachを終了するため、それ以降の要素を確認する必要がありません。

条件を満たす最初のデータを取得する

商品の中から最初に在庫がある商品を探す場合にも利用できます。

$products = [
    ['name' => '商品A', 'stock' => 0],
    ['name' => '商品B', 'stock' => 0],
    ['name' => '商品C', 'stock' => 5],
    ['name' => '商品D', 'stock' => 10],
];

$availableProduct = null;

foreach ($products as $product) {
    if ($product['stock'] > 0) {
        $availableProduct = $product;
        break;
    }
}

if ($availableProduct !== null) {
    echo $availableProduct['name'];
}

この場合は「商品C」が見つかった時点でループを終了します。

残りの「商品D」を確認する必要がないため、不要な反復処理を省略できます。

foreachでキーと値を取得しながらbreakする方法

foreachでは、値だけでなくキーも取得できます。

$fruits = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ',
];

foreach ($fruits as $key => $value) {
    echo $key . ': ' . $value . PHP_EOL;

    if ($key === 'banana') {
        break;
    }
}

実行結果は次のとおりです。

apple: りんご
banana: バナナ

bananaというキーに到達した時点でbreakが実行され、foreachが終了します。

foreachのbreakとcontinueの違い

breakと混同しやすい命令としてcontinueがあります。

どちらもループ処理の流れを変更する命令ですが、動作は異なります。

breakはループそのものを終了する

breakは現在のループを完全に終了します。

$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as $number) {
    if ($number === 3) {
        break;
    }

    echo $number . PHP_EOL;
}

実行結果は次のとおりです。

1
2

3になった時点でループそのものが終了するため、3以降の処理は実行されません。

continueは現在の反復だけをスキップする

continueはループ自体を終了するのではなく、現在の反復処理の残りを飛ばして次の要素へ進みます。

$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as $number) {
    if ($number === 3) {
        continue;
    }

    echo $number . PHP_EOL;
}

実行結果は次のとおりです。

1
2
4
5

3だけがスキップされ、foreachはその後も継続します。

breakとcontinueの違いを比較

両者の違いを整理すると、次のようになります。

命令動作
break現在のループを終了する
continue現在の反復だけを中断し、次の反復へ進む

ループ自体を終了したい場合はbreak、特定の要素だけをスキップしたい場合はcontinueを使い分けます。

break後はforeachの外側の処理へ進む

breakはPHPプログラムそのものを終了する命令ではありません。

現在のループを終了した後は、そのループの次に書かれている処理へ進みます。

$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as $number) {
    if ($number === 3) {
        break;
    }

    echo $number . PHP_EOL;
}

echo 'foreachが終了しました。';

実行結果は次のとおりです。

1
2
foreachが終了しました。

breakによってforeachは終了しますが、その後のechoは通常どおり実行されます。

ネストしたforeachでbreakを使う方法

foreachの中に別のforeachがある状態を、ネストしたループと呼びます。

通常のbreak;を使った場合は、最も内側にあるループだけが終了します。

通常のbreakでは内側のループだけを抜ける

$groups = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];

foreach ($groups as $group) {
    foreach ($group as $number) {
        if ($number === 5) {
            break;
        }

        echo $number . PHP_EOL;
    }
}

$number === 5breakが実行されても、終了するのは内側のforeachだけです。

外側のforeachは引き続き処理されます。

break 2で2階層分の処理を抜ける方法

PHPでは、breakの後ろに数値を指定できます。

break 2;

break 2;は、現在位置から2階層分のbreak対象構造を抜けるという意味です。

たとえば、2重のforeachをまとめて終了できます。

$groups = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];

foreach ($groups as $group) {
    foreach ($group as $number) {
        echo $number . PHP_EOL;

        if ($number === 5) {
            break 2;
        }
    }
}

echo '処理終了';

実行結果は次のとおりです。

1
2
3
4
5
処理終了

5になった時点で、内側と外側の2つのforeachをまとめて終了します。

break 2はループだけが対象ではない

厳密には、break 2;は「2つのループを終了する」という意味に限定されません。

PHPのbreakは、forforeachwhiledo-whileswitchなどの構造に対して使用できます。

たとえば次のようなコードもあります。

foreach ($items as $item) {
    switch ($item) {
        case 'stop':
            break 2;
    }
}

この場合のbreak 2;は、switchとその外側のforeachの2階層をまとめて終了します。

そのため、「2つのループを抜ける」ではなく、「現在位置から2階層分の対象構造を抜ける」と理解しておくと正確です。

break 3で3階層分を抜けることもできる

3階層以上にネストされた処理では、次のように書くこともできます。

break 3;

たとえば次のコードでは、3重のforeachをまとめて終了します。

foreach ($a as $valueA) {
    foreach ($b as $valueB) {
        foreach ($c as $valueC) {
            if ($valueC === 'stop') {
                break 3;
            }
        }
    }
}

ただし、break 3やそれ以上の階層指定を多用すると、コードの流れが分かりにくくなる場合があります。

ネストが深くなりすぎた場合は、処理を関数に分割するなど、コード構造そのものを見直すことも重要です。

foreach内でreturnを使う方法

foreachが関数の中にあり、条件を満たした時点で関数自体を終了したい場合は、breakではなくreturnが適していることがあります。

breakとreturnでは終了する範囲が異なる

breakはループを終了します。

一方のreturnは、現在実行している関数そのものを終了します。

たとえば、ユーザーを検索して見つかったデータを返す場合は次のように記述できます。

function findUser(array $users, int $id): ?array
{
    foreach ($users as $user) {
        if ($user['id'] === $id) {
            return $user;
        }
    }

    return null;
}

使用例は次のとおりです。

$users = [
    ['id' => 1, 'name' => '田中'],
    ['id' => 2, 'name' => '佐藤'],
];

$user = findUser($users, 2);

var_dump($user);

該当するユーザーが見つかった時点でreturnが実行され、foreachだけでなくfindUser()関数そのものが終了します。

値を検索してそのまま返す処理では、変数に代入してbreakするよりもreturnを使ったほうが簡潔になる場合があります。

foreachでbreakを使う際の注意点

break自体はシンプルな構文ですが、条件の書き方やネスト構造によっては意図しない動作になる場合があります。

breakより後ろの処理は実行されない

breakが実行されると、その反復内でbreakより後ろに書かれた処理には進みません。

foreach ($numbers as $number) {
    if ($number === 3) {
        break;
    }

    echo 'この処理は3のとき実行されません';
}

$number === 3になった時点でループの外へ移動します。

そのため、breakを記述する位置には注意が必要です。

終了条件を明確にする

終了条件が曖昧だと、想定より早い段階でループが終了する可能性があります。

たとえば、次のようなコードです。

foreach ($users as $user) {
    if ($user) {
        break;
    }
}

この場合、$userが真として評価された最初の要素で終了する可能性があります。

特定のユーザーIDを探すのであれば、次のように条件を具体的にします。

if ($user['id'] === 10) {
    break;
}

何を条件としてループを終了するのかが分かるコードにすることが重要です。

型まで比較したい場合は===を使う

PHPでは=====で比較方法が異なります。

==は必要に応じて型変換を行ったうえで値を比較します。

一方、===は値だけでなく型も一致している場合にtrueになります。

if ($number === 3) {
    break;
}

型まで一致させたい場合は、===を利用することで比較条件を明確にできます。

ただし、これはbreak固有のルールではなく、PHPにおける比較演算子の使い分けです。

foreachでbreakを使うメリット

不要な反復処理を省略できる

目的のデータが見つかった後も、必ず最後の要素まで処理する必要はありません。

たとえば100件のデータから目的のデータが10件目で見つかった場合、breakを使えば11件目以降の反復を省略できます。

ただし、どの程度処理時間が短縮されるかは、データ量や目的の要素が見つかる位置などによって異なります。

そのため、「必ず大幅に高速化できる」というよりも、「不要になった反復処理を省略できる」と考えるのが適切です。

コードの意図を分かりやすくできる

breakを使うことで、

「条件を満たしたら、ここで検索や処理を終了する」

という意図を明確に表現できます。

foreach ($products as $product) {
    if ($product['stock'] > 0) {
        $availableProduct = $product;
        break;
    }
}

このコードを見れば、「在庫がある最初の商品を見つけたら処理を終了する」という目的を把握しやすくなります。

PHPのforeachをbreakで抜ける方法のまとめ

PHPでforeachを途中で終了したい場合は、breakを使用します。

基本形は次のとおりです。

foreach ($array as $value) {
    if ($condition) {
        break;
    }
}

breakが実行されると、現在のループを終了し、ループの後にある処理へ進みます。

一方、現在の反復だけをスキップして次の要素へ進みたい場合はcontinueを使用します。

また、ネストした処理では、

break 2;

のように数値を指定することで、複数階層のbreak対象構造をまとめて終了できます。

特定のデータを検索する場合や、条件を満たした時点でそれ以上の処理が不要になる場合には、breakを適切に使用することで、不要な反復を省略しながらコードの意図も明確にできます。

以上、PHPでforeachをbreakで抜ける方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次