【PHP】ループ処理を行う方法|for・while・do-while・foreachの使い分け

同じ処理を繰り返すループは、プログラミングの基本です。PHPには forwhiledo-whileforeach の4種類があり、繰り返す条件や対象によって使い分けます。この記事ではそれぞれの使い方と選び方、注意点までまとめます。

この記事の結論:回数が決まっているなら for、条件が続く間繰り返すなら while、最低1回実行したいなら do-while、配列・オブジェクトを順に処理するなら foreach を使います。
スポンサーリンク

forループ:回数が決まった繰り返し

「初期値・条件・増分」の3つを指定し、決まった回数を繰り返します。

for
<?php
for ($i = 0; $i < 10; $i++) {
    echo $i . "\n"; // 0〜9
}

whileループ:条件が真の間くり返す

指定した条件が真である間、処理を繰り返します。繰り返し回数が事前に決まっていない場合に向いています。

while
<?php
$count = 0;
while ($count < 10) {
    echo $count . "\n";
    $count++; // ★ 条件を変える処理を忘れない(無限ループ防止)
}

do-whileループ:最低1回は実行する

do-while条件判定が後ろにあるため、条件が最初から偽でも必ず1回は実行されます。入力チェックの再入力ループなどに向いています。

do-while
<?php
$count = 0;
do {
    echo $count . "\n";
    $count++;
} while ($count < 10);
do-whileの詳しい使い方はdo-while文でループ処理を行う方法で解説しています。

foreachループ:配列・オブジェクトを順に処理

配列やオブジェクトの各要素を順番に処理するなら foreach が最適です。要素数を気にせず書けます。

foreach
<?php
$fruits = ["apple", "banana", "cherry"];
foreach ($fruits as $fruit) {
    echo $fruit . "\n";
}

// キーと値の両方
$person = ["name" => "John", "age" => 30];
foreach ($person as $key => $value) {
    echo "$key: $value\n";
}
foreachの参照渡しの注意やキーと値の取得はforeachで配列を順番に操作する方法で詳しく解説しています。

break・continueで制御する

どのループでも、breakループを抜けcontinueその回を飛ばして次へ進めます。

break / continue
<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i > 5) break;          // 5を超えたら終了
    if ($i % 2 === 0) continue; // 偶数は飛ばす
    echo $i . "\n"; // 1 / 3 / 5
}
break の詳細(多重ループの break 2 など)はforeachをbreakで終了する方法を参照してください。

注意:無限ループに気をつける

条件が永遠に真のままだと無限ループになり、サーバーのリソースを使い切ってアプリが応答しなくなります。while では条件を変える処理(カウンタの増減など)を必ず入れることが重要です。

while ($count < 10) の中で $count++ を書き忘れると、条件が永遠に真のまま無限ループになります。ループの各回で終了条件に近づいているかを必ず確認してください。

ループの使い分け

ループ 向いている場面
for 繰り返し回数が決まっている
while 条件が続く間くり返す(回数未定)
do-while 最低1回は実行したい
foreach 配列・オブジェクトを順に処理

実用サンプル:ToDoリスト

ファイルにデータを保存し、foreach で一覧表示する簡単なToDoリストの例です。表示時に htmlspecialchars() でXSS対策をしています。HTML内では foreach (...) : ... endforeach; という代替構文を使うと読みやすくなります。

todolist.php
<?php
$file = 'todos.txt';

// 追加
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['todo'])) {
    file_put_contents($file, $_POST['todo'] . PHP_EOL, FILE_APPEND);
}

// 読み込み
$todos = file_exists($file) ? file($file, FILE_IGNORE_NEW_LINES) : [];
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>ToDoリスト</title></head>
<body>
  <h1>ToDoリスト</h1>
  <form action="" method="post">
    <input type="text" name="todo" placeholder="新しいToDoを入力">
    <input type="submit" value="追加">
  </form>
  <ul>
  <?php foreach ($todos as $todo): ?>
    <li><?php echo htmlspecialchars($todo, ENT_QUOTES, 'UTF-8'); ?></li>
  <?php endforeach; ?>
  </ul>
</body>
</html>

よくある質問(FAQ)

Qforとwhileはどう使い分けますか?
A繰り返す回数が決まっているなら for回数は不定で条件が続く間くり返すなら while が向いています。配列を回すだけなら foreach が最も簡潔です。
Qdo-whileはいつ使いますか?
A最低1回は処理を実行したいときです。条件判定が後ろにあるため、条件が最初から偽でも1回は実行されます。「入力を促し、正しくなるまで繰り返す」ような場面に向いています。
Q無限ループになってしまいました。
Awhile の条件が永遠に真のままになっている可能性が高いです。ループの中でカウンタを増減するなど終了条件に近づく処理が入っているか確認してください。
Qループの途中で抜けたり飛ばしたりするには?
A抜けるなら break、その回を飛ばすなら continue を使います。どのループでも共通で使えます。

まとめ

PHPのループ処理のポイントを整理します。

  • 回数が決まっているなら for、条件で繰り返すなら while
  • 最低1回実行は do-while、配列・オブジェクトは foreach
  • 抜ける/飛ばすは break / continue
  • 無限ループに注意(終了条件に近づく処理を必ず入れる)
  • HTML内では foreach (...) : ... endforeach; の代替構文が読みやすい

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