MENU

【PHP】foreach文とbreak・continueの使い方を解説|Webの基礎

PHPのforeach文とbreak・continueの使い方を解説
目次

はじめに

前回の記事では、複数の値をまとめて扱える配列について解説しました。その中で、配列の要素を順番に処理するときはfor文とcount()を組み合わせました。

今回は、配列の要素をもっと簡単に1つずつ取り出せるforeach文と、繰り返しを途中で止めるbreak、その回だけ飛ばすcontinueについて解説します。

foreach文とは?

foreach文は、配列の要素を先頭から1つずつ取り出して、要素の数だけ処理を繰り返す構文です。

前回の記事では、配列の要素をfor文で次のように表示しました。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    for ($i = 0; $i < count($fruits); $i++) {
        echo $fruits[$i] . "<br>";
    }

同じ処理をforeach文で書くと、次のようになります。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    foreach ($fruits as $fruit) {
        echo $fruit . "<br>";
    }

どちらも実行結果は同じです。

りんご
みかん
ぶどう

foreach文では、カウンタ変数$iもcount()も使っていません。インデックスの範囲を間違える心配がないため、配列の要素を順番に処理するときはforeach文を使うのが基本です。

foreach文の基本(値を取り出す)

foreach文は、次の形で書きます。

foreach (配列 as 変数) {
    // 繰り返し実行する処理
}

asの後ろに書いた変数に、配列の要素が1回に1つずつ順番に代入されます。先ほどの例では、1回目は$fruitに"りんご"、2回目は"みかん"、3回目は"ぶどう"が入り、要素がなくなった時点で繰り返しが終わります。

foreach文が配列$fruitsの要素を1つずつ変数$fruitに代入して処理を繰り返す様子を示した図。1回目はりんご、2回目はみかん、3回目はぶどうが入り、要素がなくなると終了する

変数名は自由に付けられますが、配列名を複数形($fruits)、取り出す変数を単数形($fruit)にしておくと、何が入っているか分かりやすくなります。

VBAのFor Each 変数 In コレクション … Nextと同じ働きです。PHPではforeach (配列 as 変数)のように、配列を先に、取り出す変数を後に書く点が違います。

キーと値をセットで取り出す

as キー => 値の形で書くと、要素の値と一緒にキー(インデックス)も取り出せます。

<?php
    $fruits = ["りんご", "みかん", "ぶどう"];

    foreach ($fruits as $index => $fruit) {
        echo ($index + 1) . "番目:{$fruit}<br>";
    }

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

1番目:りんご
2番目:みかん
3番目:ぶどう

$indexには、0・1・2のインデックスが順番に入ります。

連想配列で使う

キーと値を取り出す書き方は、前回の記事で解説した連想配列でよく使います。

<?php
    $user = [
        "名前"   => "田中",
        "年齢"   => 30,
        "住まい" => "東京",
    ];

    foreach ($user as $key => $value) {
        echo "{$key}:{$value}<br>";
    }

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

名前:田中
年齢:30
住まい:東京

連想配列の中身を、キーの名前ごとに一覧で表示できました。

多次元配列で使う

「商品1つ分の連想配列」を並べた多次元配列では、foreach文で商品を1つずつ取り出し、$product["name"]のようにキーを指定して値を使います。

<?php
    $products = [
        ["name" => "ノート",     "price" => 150],
        ["name" => "ボールペン", "price" => 120],
        ["name" => "消しゴム",   "price" => 80],
    ];

    foreach ($products as $product) {
        echo "{$product["name"]}:{$product["price"]}円<br>";
    }

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

ノート:150円
ボールペン:120円
消しゴム:80円

前回の実務サンプルでは$item = $products[$i];と書いて商品を取り出していましたが、foreach文ならこの1行が不要になります。

foreachの中で配列の値を書き換えるには

foreach文で取り出した変数の値を書き換えても、元の配列は変わりません。取り出した変数は、要素のコピーだからです。

<?php
    $scores = [80, 65, 92];

    foreach ($scores as $score) {
        $score = $score + 10; // コピーを書き換えているだけ
    }

    print_r($scores); // 80, 65, 92 のまま

元の配列を書き換えたいときは、キーも取り出し、配列[キー]に代入します。

<?php
    $scores = [80, 65, 92];

    foreach ($scores as $index => $score) {
        $scores[$index] = $score + 10; // 元の配列を書き換える
    }

    print_r($scores); // 90, 75, 102 になる

foreach ($scores as &$score)のように変数の前に&を付けて、元の配列を直接書き換える方法もあります。ただし、ループの後に同じ変数名を使うと思わぬ値の書き換えが起こることがあるため、慣れるまではキーを使って書き換える方法がおすすめです。

break:繰り返しを途中で抜ける

breakは、繰り返しを途中で終了して、ループの外に抜ける命令です。switch文の記事で使ったbreakと同じキーワードで、for文・while文・foreach文のどれでも使えます。

<?php
    $scores = [72, 85, 45, 90, 38];

    foreach ($scores as $index => $score) {
        if ($score < 50) {
            echo ($index + 1) . "人目で50点未満が見つかりました";
            break; // ここでループを終了
        }
        echo ($index + 1) . "人目:{$score}点<br>";
    }

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

1人目:72点
2人目:85点
3人目で50点未満が見つかりました

3人目でbreakが実行され、4人目・5人目は処理されずにループが終わります。「条件に合うものが1つ見つかれば、それ以上探す必要がない」ときに使います。

continue:その回だけ飛ばして次へ進む

continueは、繰り返しを終了するのではなく、その回の残りの処理だけを飛ばして、次の回に進む命令です。

<?php
    $scores = [72, 85, 45, 90, 38];

    foreach ($scores as $index => $score) {
        if ($score < 50) {
            continue; // この回は飛ばして次の要素へ
        }
        echo ($index + 1) . "人目:{$score}点<br>";
    }

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

1人目:72点
2人目:85点
4人目:90点

50点未満の3人目と5人目はcontinueで飛ばされ、それ以外の人だけが表示されます。「条件に合わないものは除いて、残りを処理したい」ときに使います。

breakとcontinueの違いを比べた図。同じ点数の配列で、breakは50点未満が見つかった3人目でループ自体を終了し、continueは50点未満の3人目と5人目だけを飛ばして最後まで繰り返す
命令動き使う場面
breakループ自体を終了する探しているものが見つかったら終わりにしたい
continueその回だけ飛ばして次の回へ進む条件に合わないものを除いて処理したい

for文の中にfor文を書いた2重ループでは、breakで抜けられるのは内側のループだけです。外側のループまでまとめて抜けたいときは、break 2;のように抜けるループの数を指定します。

HTMLと組み合わせる書き方(代替構文)

if文の記事で紹介した代替構文は、foreach文でも使えます。{ }の代わりに:とendforeach;を使います。

<?php
    $menu = ["ホーム", "サービス", "会社概要", "お問い合わせ"];
?>
<ul>
    <?php foreach ($menu as $item): ?>
        <li><?php echo $item; ?></li>
    <?php endforeach; ?>
</ul>

配列の要素の数だけ<li>が出力され、メニューの項目が箇条書きで表示されます。WordPressのテーマファイルでもよく見かける書き方です。

実務サンプル(おすすめ商品を最大3件表示する)

ネットショップのトップページで、おすすめ商品を表示する部分を想定したサンプルです。在庫切れの商品は飛ばし(continue)、表示が3件に達したら終了(break)します。

商品データ5件をforeach文で処理した結果を示した図。在庫0の商品はcontinueで飛ばされ、在庫ありの商品を3件表示した時点でbreakによりループが終了し、残りの商品は処理されない
<?php
    // おすすめ商品(データベースから取得した想定)
    $products = [
        ["name" => "ノート",       "price" => 150, "stock" => 12],
        ["name" => "ボールペン",   "price" => 120, "stock" => 0],
        ["name" => "消しゴム",     "price" => 80,  "stock" => 30],
        ["name" => "付箋",         "price" => 200, "stock" => 5],
        ["name" => "クリップ",     "price" => 100, "stock" => 20],
    ];

    $maxCount = 3; // 表示する最大件数
    $count    = 0; // 表示した件数
?>
<h2>おすすめ商品</h2>
<ul>
    <?php foreach ($products as $product): ?>
        <?php
            // ① 在庫切れの商品は表示しない
            if ($product["stock"] === 0) {
                continue;
            }
        ?>
        <li><?php echo $product["name"]; ?>(<?php echo $product["price"]; ?>円)</li>
        <?php
            // ② 表示した件数を数え、上限に達したら終了する
            $count++;
            if ($count >= $maxCount) {
                break;
            }
        ?>
    <?php endforeach; ?>
</ul>

ブラウザには次のように表示されます。

おすすめ商品
・ノート(150円)
・消しゴム(80円)
・付箋(200円)

在庫が0の「ボールペン」はcontinueで飛ばされ、3件目の「付箋」を表示した時点でbreakによりループが終わるため、「クリップ」は表示されません。表示件数を変えたいときは$maxCountの値を変えるだけで済みます。

よくある質問・エラー対処

Q. foreach() argument must be of type array|objectという警告が出ます

→ foreach文に配列以外(文字列やnullなど)を渡しています。foreach (配列 as 変数)の配列の部分の変数名が合っているか、値が空(null)になっていないかを確認してください。


Q. 'break' not in the 'loop' or 'switch' contextというエラーが出ます

→ breakやcontinueを、ループやswitch文の外に書いています。ifの{ }の外に出てしまっていないかなど、括弧の対応を確認してください。このエラーは実行前に発生するため、ページ全体が表示されなくなります。


Q. foreachの中で値を書き換えたのに、配列が変わりません

→ foreachで取り出した変数は要素のコピーのため、書き換えても元の配列には反映されません。foreach ($配列 as $key => $value)でキーも取り出し、$配列[$key] = 新しい値;と書いてください。


Q. for文とforeach文はどちらを使えばいいですか?

→ 配列の要素を順番に処理するならforeach文、「10回繰り返す」のように配列を使わずに回数で繰り返すならfor文、が目安です。

おわりに(まとめ)

まとめ

配列を繰り返し処理するならforeach文、途中で止めたり飛ばしたりするならbreak・continueを使います。

  • ✅ foreach (配列 as 変数) で、要素を1つずつ取り出して繰り返す
  • ✅ as キー => 値 で、キーと値をセットで取り出せる
  • ✅ 取り出した変数を書き換えても、元の配列は変わらない
  • ✅ break はループ自体を終了する
  • ✅ continue はその回だけ飛ばして次の回へ進む
  • ✅ HTMLと組み合わせるときは foreach: 〜 endforeach; の代替構文が便利

次回は、配列に要素を追加・削除したり、値を検索したりする関数について解説します。

次回は、配列でよく使う関数のうち、要素の追加・削除と、値の検索に使う関数について解説予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


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