MENU

【PHP】for文・while文の使い方を解説|Webの基礎

PHPのfor文・while文の使い方を解説|Webの基礎
目次

はじめに

前回の記事では、switch文とmatch式による条件分岐について解説しました。

今回は、同じ処理を何度も実行する繰り返し処理について解説します。PHPで繰り返しを書く構文はいくつかありますが、この記事では基本となるfor文とwhile文(あわせてdo-while文)を取り上げます。

繰り返し処理(ループ)とは?

繰り返し処理とは、同じ処理を、決まった回数や条件を満たす間、くり返し実行する仕組みです。ループとも呼ばれます。

たとえば、「1」から「5」までの数字を画面に表示したい場合、繰り返しを使わずに書くと次のようになります。

<?php
    echo "1<br>";
    echo "2<br>";
    echo "3<br>";
    echo "4<br>";
    echo "5<br>";

100回、1000回となると現実的ではありません。繰り返し処理を使えば、数行のコードで書けます。

コード例の<br>は、ブラウザで改行して表示するためのHTMLタグです。echoで出力した内容はHTMLとしてブラウザに表示されるため、<br>を付けないと数字が1行につながって表示されます。

for文の基本

for文は、繰り返す回数が決まっているときによく使う構文です。次の形で書きます。

for (初期化; 条件式; 更新) {
    // 繰り返し実行する処理
}

先ほどの「1〜5を表示する」処理をfor文で書くと、次のようになります。

<?php
    for ($i = 1; $i <= 5; $i++) {
        echo $i . "<br>";
    }

実行すると、ブラウザに次のように表示されます。

1
2
3
4
5

forの後ろの()の中には、セミコロン(;)で区切って3つの式を書きます。

部分例役割
初期化$i = 1最初に1回だけ実行する。回数を数える変数を用意する
条件式$i <= 5毎回、処理の前にチェックする。trueの間は繰り返す
更新$i++毎回、処理の後に実行する。変数の値を1増やす

$i++は、演算子の記事で解説したインクリメント演算子で、$i = $i + 1と同じ意味です。回数を数える変数(カウンタ変数)の名前は自由ですが、慣習として$iがよく使われます。

for文が実行される順番

for文は、次の順番で処理が進みます。

  1. 初期化($i = 1)を1回だけ実行する
  2. 条件式($i <= 5)をチェックする。falseなら繰り返しを終了する
  3. {}の中の処理(echo)を実行する
  4. 更新($i++)を実行し、2に戻る
for文の処理の流れを示した図。初期化を1回実行した後、条件式がtrueの間は処理と更新を繰り返し、falseになったらループを抜ける

$iが6になった時点で条件式$i <= 5がfalseになり、繰り返しが終わります。つまり、{}の中の処理は$iが1〜5の5回だけ実行されます。

VBAのFor i = 1 To 5 … Nextと同じ働きです。VBAでは終了値(To 5)を書きますが、PHPでは「続ける条件」($i <= 5)を書く点が違います。

増やし方・減らし方を変える

更新の部分を変えると、2つずつ増やしたり、1つずつ減らしたりできます。

<?php
    // 2ずつ増やす(偶数を表示)
    for ($i = 2; $i <= 10; $i += 2) {
        echo $i . " ";
    }
    // 2 4 6 8 10

    echo "<br>";

    // 1ずつ減らす(カウントダウン)
    for ($i = 3; $i >= 1; $i--) {
        echo $i . " ";
    }
    // 3 2 1

$i += 2は$i = $i + 2、$i--は$i = $i - 1と同じ意味です。カウントダウンの場合は、条件式も$i >= 1のように「1以上の間」と書く点に注意してください。

繰り返しで合計を求める

繰り返し処理は、合計や件数を数えるときにもよく使います。次のコードは、1から100までの合計を求めます。

<?php
    $total = 0;

    for ($i = 1; $i <= 100; $i++) {
        $total += $i;
    }

    echo "1から100までの合計:{$total}"; // 1から100までの合計:5050

合計を入れる変数$totalは、ループの前で0にしておきます。ループの中で$total = 0;と書いてしまうと、毎回0に戻ってしまい正しく計算できません。

while文の基本

while文は、条件を満たしている間、処理を繰り返す構文です。繰り返す回数が事前に決まっていないときに向いています。

while (条件式) {
    // 条件式がtrueの間、繰り返す処理
}

1〜5を表示する処理をwhile文で書くと、次のようになります。

<?php
    $i = 1;

    while ($i <= 5) {
        echo $i . "<br>";
        $i++;
    }

for文では()の中にまとめて書いていた「初期化」と「更新」を、while文ではループの外と中に分けて書きます。結果はfor文と同じく、1〜5が表示されます。

while文では、ループの中で条件式に関わる変数を変化させる(この例では$i++)のを忘れないようにしてください。忘れると条件式がずっとtrueのままになり、処理が終わらなくなります(後述の「無限ループ」)。

回数が決まっていない繰り返しの例

while文が活躍するのは、「何回繰り返すか」が計算してみないと分からない場面です。次のコードは、所持金1,000円で1個180円のお菓子を、買えるだけ買う処理です。

<?php
    $money = 1000; // 所持金
    $price = 180;  // 1個の値段
    $count = 0;    // 買った個数

    while ($money >= $price) {
        $money -= $price;
        $count++;
    }

    echo "買えた個数:{$count}個<br>";
    echo "残りのお金:{$money}円";

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

買えた個数:5個
残りのお金:100円

残りが180円未満になった時点で繰り返しが終わります。このように、終わる条件ははっきりしているが回数は分からない処理には、while文が向いています。

do-while文(最低1回は実行する)

do-while文は、while文の仲間で、処理を先に実行してから条件式をチェックする構文です。

do {
    // 繰り返す処理
} while (条件式);

最後のwhile (条件式)の後ろに、セミコロン(;)が必要な点に注意してください。

while文との違いは、最初から条件式がfalseのときの動きです。次のコードで比べてみます。

<?php
    $count = 10;

    // while文:最初に条件をチェックする
    while ($count < 5) {
        echo "whileの処理:{$count}<br>";
        $count++;
    }

    // do-while文:先に処理を実行してから条件をチェックする
    do {
        echo "do-whileの処理:{$count}<br>";
        $count++;
    } while ($count < 5);

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

do-whileの処理:10

$countは最初から10なので、条件式$count < 5はfalseです。while文は最初のチェックで終わるため、一度も実行されません。一方、do-while文は先に処理を実行するため、条件に関係なく最低1回は実行されます。

while文とdo-while文の処理の流れを比べた図。while文は先に条件式をチェックし、do-while文は先に処理を実行してから条件式をチェックする

使う場面は多くないため、「最低1回は実行される書き方もある」と知っておけば十分です。

無限ループに注意

繰り返し処理でいちばん気をつけたいのが、条件式がずっとtrueのままで、処理が終わらなくなる「無限ループ」です。

<?php
    // 悪い例:$i++を書き忘れている
    $i = 1;

    while ($i <= 5) {
        echo $i . "<br>";
    }

$iがずっと1のままなので、条件式$i <= 5は永遠にtrueです。ブラウザで開くと読み込み中のまま画面が表示されず、しばらくすると次のようなエラーが表示されます。

PHPには、1つのプログラムを実行できる制限時間が設定されています(XAMPPの初期設定では120秒)。無限ループになっても、この時間を過ぎると強制的に止まる仕組みです。

無限ループのよくある原因は、次のとおりです。

  • while文で、ループの中の更新($i++など)を書き忘れている
  • for文で、更新の向きと条件式が合っていない($i <= 5なのに$i--で減らしている など)

画面が真っ白のまま読み込みが終わらないときは、ブラウザの読み込みを中止(×ボタンまたはEscキー)してから、コードを見直してください。止まらない場合は、XAMPP Control PanelでApacheを一度「Stop」して「Start」し直すと確実です。

for文とwhile文の使い分け

どちらでも書ける処理は多いですが、使い分けの目安は次のとおりです。

構文向いている場面例
for文繰り返す回数が決まっている1〜100の合計、12か月分の表示
while文終わる条件は決まっているが、回数は分からない残高がなくなるまで、目標額に届くまで
do-while文最低1回は必ず実行したい1回実行して結果で続けるか決める

for文は「初期化・条件式・更新」が1行にまとまっているため、何回繰り返すのかがひと目で分かり、更新の書き忘れによる無限ループも起こりにくいのが利点です。迷ったら、回数が決まっていればfor文を選びましょう。

PHPには、配列(複数の値をまとめて入れる入れ物)の要素を1つずつ取り出して繰り返すforeach文もあります。次回の記事で配列の基本を解説した後、その次の記事でforeach文を解説します。

実務サンプル(生年月日のプルダウンを作る)

会員登録フォームなどでよく見かける、生年月日を選ぶプルダウン(<select>)をfor文で作るサンプルです。年・月・日の選択肢(<option>)をすべて手書きすると100行以上になりますが、for文なら数行で作れます。

for文で作った生年月日のプルダウンの表示例。年は今年から1950年まで新しい順、月は1〜12、日は1〜31の選択肢が並ぶ
<?php
    $thisYear = (int)date("Y"); // 今年の西暦(例:2026)
?>
<form>
    <label>生年月日:</label>

    <!-- ① 年:今年から1950年まで、新しい順に並べる -->
    <select name="year">
        <?php for ($y = $thisYear; $y >= 1950; $y--): ?>
            <option value="<?php echo $y; ?>"><?php echo $y; ?>年</option>
        <?php endfor; ?>
    </select>

    <!-- ② 月:1〜12 -->
    <select name="month">
        <?php for ($m = 1; $m <= 12; $m++): ?>
            <option value="<?php echo $m; ?>"><?php echo $m; ?>月</option>
        <?php endfor; ?>
    </select>

    <!-- ③ 日:1〜31 -->
    <select name="day">
        <?php for ($d = 1; $d <= 31; $d++): ?>
            <option value="<?php echo $d; ?>"><?php echo $d; ?>日</option>
        <?php endfor; ?>
    </select>
</form>

ポイントは次のとおりです。

  • date("Y")は、今日の日付から西暦4桁を取り出す関数です(日付を扱う関数は別の回で解説します)。今年の年を自動で取得するため、年が変わってもコードを書き換える必要がありません
  • 年は新しい順に並べたいので、今年から1ずつ減らすfor文にしています($y--、条件式は$y >= 1950)
  • <?php for (…): ?>と<?php endfor; ?>の間に書いたHTMLが、繰り返しの回数分だけ出力されます。if文の記事で紹介した代替構文のfor文版で、{ }の代わりに:とendfor;を使います。while文も同じようにwhile (条件式):〜endwhile;と書けます

ブラウザで右クリックして「ページのソースを表示」を選ぶと、<option>タグが繰り返し出力されていることを確認できます。

日の選択肢は月に関係なく1〜31日のため、2月30日のような存在しない日付も選べます。実際のフォームでは、送信された値が正しい日付かをPHP側でチェックします(フォーム処理は第2弾で解説予定です)。

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

Q. ページが表示されず、Maximum execution time of ○○ seconds exceededというエラーが出ます

→ 無限ループになっている可能性が高いです。while文の中で条件式に関わる変数を更新しているか、for文の更新の向き(++か--か)と条件式が合っているかを確認してください。


Q. 繰り返しの回数が1回多い(少ない)です

→ 条件式の<と<=の違いが原因のことが多いです。$i = 1; $i < 5では1〜4の4回、$i = 1; $i <= 5では1〜5の5回になります。最初の値と最後の値で、実際に何回実行されるかを確認してください。


Q. for文でParse error: syntax errorが出ます

→ forの()の中の区切りが、セミコロン(;)になっているか確認してください。for ($i = 1, $i <= 5, $i++)のようにカンマで区切るとエラーになります。do-while文は最後の;も確認しましょう。

おわりに(まとめ)

まとめ

同じ処理を何度も実行するなら、for文とwhile文を使うと短く書けます。

  • ✅ for文は「初期化; 条件式; 更新」の3つの式で、繰り返しを1行で指定する
  • ✅ for文は、繰り返す回数が決まっているときに向いている
  • ✅ while文は、条件式がtrueの間、処理を繰り返す
  • ✅ while文は、終わる条件は決まっているが回数は分からないときに向いている
  • ✅ do-while文は、先に処理を実行するため最低1回は実行される
  • ✅ 条件式がずっとtrueのままだと無限ループになるので、更新の書き忘れに注意する

次回は、複数の値をまとめて扱う「配列」の基本について解説します。

次回は、複数の値を1つの変数にまとめて扱える「配列」の作り方と使い方について解説予定です。

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

関連記事

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

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

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


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


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