PHPのforeachでcontinueを使う方法について

採用はこちら

PHPのforeachcontinueを使うと、現在処理している要素の残りの処理をスキップして、次の要素へ進むことができます。

特定の条件に当てはまるデータを処理対象から除外したい場合や、不要な処理を途中で打ち切りたい場合に便利です。

continueforeachだけでなく、forwhiledo-whileなどのループでも利用できます。

ここでは、PHPのforeachcontinueを使う基本的な方法から、breakとの違い、continue 2の使い方、実務での活用例まで詳しく解説します。

目次

PHPのcontinueとは

現在の繰り返しだけをスキップする構文

PHPのcontinueは、ループ処理の途中で現在の反復の残りをスキップし、次の反復へ進むための制御構文です。

foreachで使った場合は、現在処理している要素について、それ以降に書かれている処理を実行せず、次の要素へ移ります。

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

foreach ($array as $value) {
    if (条件) {
        continue;
    }

    // 条件に当てはまらなかった場合に実行する処理
}

continueが実行されると、その反復における後続処理は実行されません。

ただし、foreachそのものは終了せず、次の要素の処理が続きます。

foreachでcontinueを使う基本的な書き方

特定の値だけスキップする

例えば、配列の中から3だけを除外して表示する場合は、次のように書けます。

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

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

    echo $number . PHP_EOL;
}

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

1
2
4
5

$number3のときにcontinueが実行されるため、その後のechoは実行されません。

そのまま次の値である4の処理へ進みます。

条件に一致する値をcontinueで除外する方法

偶数をスキップして奇数だけ処理する

continueは条件式と組み合わせることで、特定の条件に一致するデータをまとめて除外できます。

例えば、偶数をスキップして奇数だけを表示する場合は次のように書きます。

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

foreach ($numbers as $number) {
    if ($number % 2 === 0) {
        continue;
    }

    echo $number . PHP_EOL;
}

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

1
3
5

$number % 2 === 0は、2で割った余りが0であることを意味します。

つまり、偶数の場合だけcontinueによって処理がスキップされます。

foreachのキーを条件にcontinueする方法

キーと値の両方を取得する

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

foreach ($array as $key => $value) {
    // 処理
}

取得したキーを使って、特定の要素をスキップすることもできます。

$users = [
    'admin' => '田中',
    'guest' => '佐藤',
    'member' => '鈴木',
];

foreach ($users as $role => $name) {
    if ($role === 'guest') {
        continue;
    }

    echo $name . PHP_EOL;
}

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

田中
鈴木

キーがguestの場合だけ処理がスキップされます。

そのため、特定の権限やカテゴリーなどを条件に除外したい場合にも利用できます。

多次元配列でcontinueを使う方法

無効なユーザーをスキップする

実際のWebアプリケーションでは、多次元配列をforeachで処理する場面が多くあります。

例えば、ユーザー一覧から無効なユーザーだけを除外する場合は次のように書けます。

$users = [
    [
        'name' => '田中',
        'active' => true,
    ],
    [
        'name' => '佐藤',
        'active' => false,
    ],
    [
        'name' => '鈴木',
        'active' => true,
    ],
];

foreach ($users as $user) {
    if (!$user['active']) {
        continue;
    }

    echo $user['name'] . PHP_EOL;
}

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

田中
鈴木

activefalseのユーザーはcontinueによって除外されます。

このような書き方は、ユーザー一覧、商品一覧、記事一覧などのデータを処理するときによく利用されます。

空の値をcontinueでスキップする方法

空文字列だけを除外する

配列の中に空の値が含まれている場合にもcontinueを利用できます。

$names = ['田中', '', '佐藤', '', '鈴木'];

foreach ($names as $name) {
    if ($name === '') {
        continue;
    }

    echo $name . PHP_EOL;
}

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

田中
佐藤
鈴木

この場合は、空文字列だけが処理対象から除外されます。

empty()を使う場合の注意点

空データの判定にはempty()を使うこともできます。

if (empty($value)) {
    continue;
}

ただし、empty()は空文字列だけを判定するものではありません。

0"0"falsenullなども空と判断されます。

そのため、空文字列だけを除外したい場合には次のように厳密比較を使うほうが適しています。

if ($value === '') {
    continue;
}

どの値を除外したいのかを明確にしたうえで、条件式を使い分けることが重要です。

continueを使ってif文のネストを減らす方法

処理対象外のデータを最初に除外する

continueを使わなくても、if文だけで条件分岐を作ることはできます。

例えば、アクティブなユーザーだけを処理する場合は次のように書けます。

foreach ($users as $user) {
    if ($user['active']) {
        echo $user['name'] . PHP_EOL;
    }
}

この程度であれば問題ありません。

しかし、処理が複雑になるとif文の中に多くの処理を書くことになります。

foreach ($users as $user) {
    if ($user['active']) {
        // 処理1
        // 処理2
        // 処理3
        // 処理4
    }
}

continueを使うと、処理対象外のデータを先に除外できます。

foreach ($users as $user) {
    if (!$user['active']) {
        continue;
    }

    // 処理1
    // 処理2
    // 処理3
    // 処理4
}

このように不要なケースを先に除外する書き方は、ガード節として利用できます。

ネストを浅くできるため、処理の流れが読みやすくなる場合があります。

ただし、continueを多用しすぎると逆に処理を追いにくくなることもあるため、適度に使うことが大切です。

複数の条件でcontinueする方法

条件ごとにcontinueを書く

複数の条件を設定し、それぞれにcontinueを書くこともできます。

foreach ($users as $user) {
    if (!$user['active']) {
        continue;
    }

    if ($user['age'] < 18) {
        continue;
    }

    echo $user['name'] . PHP_EOL;
}

このコードでは、非アクティブなユーザーと18歳未満のユーザーがスキップされます。

すべての条件を通過したユーザーだけが最後の処理まで到達します。

OR条件でまとめる

条件が単純であれば、論理演算子の||を使ってまとめることもできます。

foreach ($users as $user) {
    if (!$user['active'] || $user['age'] < 18) {
        continue;
    }

    echo $user['name'] . PHP_EOL;
}

この場合は、「非アクティブ、または18歳未満」であればスキップされます。

条件が複雑な場合は分けて書き、単純な場合はまとめるなど、読みやすさを基準に使い分けるとよいでしょう。

continueとbreakの違い

continueは次の繰り返しへ進む

continueは現在の反復だけをスキップします。

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

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

    echo $number;
}

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

1245

3だけが除外されますが、その後の45は処理されます。

breakはforeachそのものを終了する

一方、breakはループそのものを終了します。

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

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

    echo $number;
}

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

12

3に到達した時点でforeachが終了するため、45も処理されません。

そのため、基本的には次のように使い分けます。

構文動作
continue現在の反復をスキップして次へ進む
breakループそのものを終了する

「この要素だけ飛ばしたい」という場合はcontinueを使い、「これ以上ループを続ける必要がない」という場合はbreakを使います。

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

通常のcontinueは最も内側のループに作用する

foreachの中に別のforeachがある場合にもcontinueを使用できます。

foreach ($groups as $group) {
    foreach ($group as $user) {
        if (!$user['active']) {
            continue;
        }

        echo $user['name'];
    }
}

この場合、continueが対象にするのは最も内側のforeachです。

つまり、現在のユーザーの残りの処理をスキップして、内側のforeachの次の要素へ進みます。

continue 2の使い方

外側のループの次の反復へ進む

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

continue 2;

数値は、何階層分のループを対象にするかを表します。

例えば次のコードです。

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

foreach ($groups as $group) {
    foreach ($group as $number) {
        if ($number === 2) {
            continue 2;
        }

        echo $number . PHP_EOL;
    }
}

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

1
4
5
6

2に到達するとcontinue 2が実行されます。

その結果、内側のforeachの残りの3は処理されず、外側のforeachの次の反復へ進みます。

continue 2以上の多段階指定も可能ですが、ネストが深くなるほど処理の流れが分かりにくくなりやすいため、必要以上に使わないほうがよいでしょう。

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

continueを書く位置に注意する

continueが実行されると、その反復における後続処理には到達しません。

例えば次のコードです。

foreach ($users as $user) {
    if (!$user['active']) {
        continue;

        echo '無効なユーザーです';
    }
}

この場合、echoは実行されません。

無効なユーザーについて何らかの処理を行いたい場合は、continueより前に記述します。

foreach ($users as $user) {
    if (!$user['active']) {
        echo '無効なユーザーです';
        continue;
    }

    echo $user['name'];
}

continueの位置によって実行される処理が変わるため、コードを書く順番には注意が必要です。

foreachとcontinueの実践的な使い方

在庫切れの商品をスキップする

ECサイトなどでは、在庫切れの商品を処理対象から除外する用途に使えます。

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

foreach ($products as $product) {
    if ($product['stock'] <= 0) {
        continue;
    }

    echo $product['name'] . PHP_EOL;
}

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

商品A
商品C

在庫数が0以下の商品は処理対象から除外されます。

非公開の記事をスキップする

CMSなどの記事一覧を処理する場合にも利用できます。

foreach ($posts as $post) {
    if ($post['status'] !== 'published') {
        continue;
    }

    echo $post['title'];
}

statuspublishedではない記事はスキップされます。

そのため、公開記事だけを後続処理の対象にできます。

必須データがない要素をスキップする

必須項目が存在しないデータを除外する用途にも使えます。

foreach ($users as $user) {
    if (!isset($user['email'])) {
        continue;
    }

    echo $user['email'] . PHP_EOL;
}

このコードでは、emailキーが存在しないユーザーをスキップします。

必要なデータが揃っている要素だけを安全に後続処理へ渡せます。

continueを使うときの注意点

否定条件が増えすぎないようにする

ガード節としてcontinueを使う場合は、処理したくない条件を書くことが多くなります。

例えば、アクティブなユーザーだけを処理する場合は次のようになります。

if (!$user['active']) {
    continue;
}

条件が少ない場合は分かりやすいですが、否定条件が大量に並ぶとかえって理解しにくくなることがあります。

その場合は、条件判定を関数に切り出すなどの方法も検討するとよいでしょう。

==と===を適切に使い分ける

PHPには、値を比較する==と、値と型を比較する===があります。

例えば次の2つは意味が異なります。

if ($value == 0) {
    continue;
}
if ($value === 0) {
    continue;
}

===は値だけでなく型も一致しているかを確認する厳密比較です。

意図しない型変換を避けたい場合は、データの性質に応じて===!==を使うと安全です。

ただし、常に厳密比較だけが正しいわけではありません。

入力データの型や処理の目的に応じて選択することが重要です。

continueを多用しすぎない

continueは便利ですが、1つのループの中で大量に使うと、処理の流れを追いにくくなる場合があります。

foreach ($users as $user) {
    if (条件1) {
        continue;
    }

    if (条件2) {
        continue;
    }

    if (条件3) {
        continue;
    }

    if (条件4) {
        continue;
    }

    // メイン処理
}

条件が増えすぎる場合は、判定処理を別の関数へ分けるなど、コード全体の構造を見直すことも大切です。

foreachは配列以外にも利用できる

Traversableオブジェクトも反復処理できる

foreachは配列を処理するときによく利用されますが、対象は配列だけではありません。

PHPでは、Traversableを実装したオブジェクトなどもforeachで反復処理できます。

そのため、厳密にはforeachは「配列専用の構文」ではありません。

ただし、初心者がPHPを学ぶ場合は、まず配列の繰り返し処理として理解すると分かりやすいでしょう。

switchとcontinueを組み合わせる場合は注意する

switch内ではcontinueの扱いが特殊になる

continueはループ内で使用するのが基本ですが、switchと組み合わせた場合は注意が必要です。

特に、ループの中にswitchがある場合、continueの階層指定によって意図した動作と異なることがあります。

例えば、外側のループの次の反復へ進めたい場合にはcontinue 2が必要になるケースがあります。

この挙動は初心者には分かりにくいため、switchとループを組み合わせる場合は、処理対象となる階層を意識してコードを書くことが重要です。

foreachでcontinueを使うメリット

不要なデータを早い段階で除外できる

continueの大きなメリットは、処理対象外のデータを早い段階で除外できることです。

例えば、次のような用途があります。

  • 無効なユーザーを除外する
  • 空の値をスキップする
  • 特定の値だけ除外する
  • 非公開の記事を除外する
  • 在庫切れの商品を除外する
  • 必須データがない要素を除外する
  • 特定のキーを持つ要素を除外する
  • 条件分岐のネストを浅くする

特に、処理対象外のケースを最初にcontinueで除外しておくと、メインとなる処理を浅い階層に配置しやすくなります。

ただし、可読性が必ず向上するわけではありません。

条件の数や処理内容に応じて、通常のif文との使い分けを考える必要があります。

PHPのforeachとcontinueを正しく使い分けよう

PHPのforeachcontinueを使用すると、現在処理している要素の残りの処理をスキップして、次の要素へ進めます。

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

foreach ($array as $value) {
    if (スキップする条件) {
        continue;
    }

    // 実行したい処理
}

一方、ループそのものを終了したい場合にはbreakを使用します。

「現在の要素だけを飛ばしたい場合はcontinue」、「これ以上ループを続ける必要がない場合はbreak」と覚えておくと理解しやすいでしょう。

また、ネストしたループではcontinue 2を利用できますが、階層が増えるほど処理の流れが分かりにくくなるため注意が必要です。

実務では、無効データや処理対象外のデータを先にcontinueで除外することで、コードを整理しやすくなる場合があります。

continueの動作と注意点を理解し、状況に応じて適切に使い分けることが重要です。

以上、PHPのforeachでcontinueを使う方法についてでした。

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

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