言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. for 文

for 文

繰り返し処理は、同じ処理を一定の回数だけ実行する仕組みです。『PHP』では『for』文を使うと、初期化・条件・更新をひとつの構文にまとめてループを記述できます。

構文

// 基本構文
for (初期化; 条件式; 更新式) {
	// 条件式がtrueの間、繰り返し実行される処理
}

// カウントアップ(0 から n-1 まで)
for ($i = 0; $i < $count; $i++) {
	// ...
}

// カウントダウン(n から 1 まで)
for ($i = $count; $i >= 1; $i--) {
	// ...
}

// ステップ変更(2ずつ増加)
for ($i = 0; $i <= $max; $i += 2) {
	// ...
}

構文の各部分

構文概要
初期化ループ開始前に1回だけ実行される式です。通常はカウンタ変数の宣言と初期値の設定を行います。複数の式をカンマで区切って記述することもできます。
条件式各繰り返しの先頭で評価されます。結果が『true』であればブロックを実行し、『false』になるとループを終了します。省略するとループが無限に続きます。
更新式各繰り返しのブロック実行後に評価される式です。通常はカウンタ変数のインクリメント($i++)やデクリメント($i--)、加算代入($i += n)を記述します。

ループ制御

構文概要
breakループを即座に終了します。条件が成立した時点でそれ以降の繰り返しをすべてスキップします。
break n数値を指定すると、ネストしたループをn段分まとめて抜けます。
continue現在の繰り返しの残り処理をスキップして次の繰り返しへ進みます。更新式は実行されます。
continue n数値を指定すると、ネストしたループのn段分外側の次の繰り返しへ進みます。

forとforeachの使い分け

構文適しているケース
for繰り返し回数が明確な場合、カウンタの値を参照しながら処理する場合、逆順・ステップ指定など柔軟な制御が必要な場合に使用します。
foreach配列・オブジェクトの全要素を順番に処理する場合に使用します。インデックス管理が不要で記述がシンプルになります。連想配列のキーと値を同時に取得したい場合にも適しています。

サンプルコード

for_loop_basic.php
<?php
// 龍が如くシリーズの主人公が敵をカウントアップで撃破していきます
$heroName = "桐生一馬";
$enemyCount = 5;

// $i = 1 から始めて $enemyCount の間、1ずつカウントアップします
for ($i = 1; $i <= $enemyCount; $i++) {
	echo $heroName . ": " . $i . "人目の敵を撃破しました\n";
}

実行すると次のように出力されます。

php for_loop_basic.php
桐生一馬: 1人目の敵を撃破しました
桐生一馬: 2人目の敵を撃破しました
桐生一馬: 3人目の敵を撃破しました
桐生一馬: 4人目の敵を撃破しました
桐生一馬: 5人目の敵を撃破しました
for_loop_countdown.php
<?php
// カウントダウン:ラウンド数を逆順に表示します
$totalRounds = 5;

// $i = $totalRounds から始めて 1 になるまで1ずつカウントダウンします
for ($i = $totalRounds; $i >= 1; $i--) {
	echo "ラウンド " . $i . " スタート!\n";
}
echo "最終ラウンド終了\n";

実行すると次のように出力されます。

php for_loop_countdown.php
ラウンド 5 スタート!
ラウンド 4 スタート!
ラウンド 3 スタート!
ラウンド 2 スタート!
ラウンド 1 スタート!
最終ラウンド終了
for_loop_step.php
<?php
// ステップ変更:ヒートゲージが10ずつ増加していきます
$characterName = "荒川真澄";
$maxHeat = 100;

// $i += 10 で10ずつカウントアップします
for ($i = 0; $i <= $maxHeat; $i += 10) {
	echo $characterName . " のヒートゲージ: " . $i . "%\n";
}

実行すると次のように出力されます。

php for_loop_step.php
荒川真澄 のヒートゲージ: 0%
荒川真澄 のヒートゲージ: 10%
荒川真澄 のヒートゲージ: 20%
荒川真澄 のヒートゲージ: 30%
荒川真澄 のヒートゲージ: 40%
荒川真澄 のヒートゲージ: 50%
荒川真澄 のヒートゲージ: 60%
荒川真澄 のヒートゲージ: 70%
荒川真澄 のヒートゲージ: 80%
荒川真澄 のヒートゲージ: 90%
荒川真澄 のヒートゲージ: 100%
for_loop_break_continue.php
<?php
// breakとcontinueによるループ制御です
$members = ["桐生一馬", "真島吾朗", "澤村遥", "品田辰雄", "渡瀬勝"];

echo "--- continueで特定メンバーをスキップ ---\n";
// 澤村遥はスキップして他のメンバーだけ処理します
for ($i = 0; $i < count($members); $i++) {
	if ($members[$i] === "澤村遥") {
		continue; // 残りの処理をスキップして次の繰り返しへ進みます
	}
	echo $members[$i] . ": 出撃準備完了\n";
}

echo "\n--- breakで目標発見時にループを終了 ---\n";
$target = "品田辰雄";
// 目標メンバーを見つけたらループを終了します
for ($i = 0; $i < count($members); $i++) {
	echo $members[$i] . " を確認中...\n";
	if ($members[$i] === $target) {
		echo $target . " を発見しました。捜索を終了します\n";
		break; // ループを即座に終了します
	}
}

実行すると次のように出力されます。

php for_loop_break_continue.php
--- continueで特定メンバーをスキップ ---
桐生一馬: 出撃準備完了
真島吾朗: 出撃準備完了
品田辰雄: 出撃準備完了
渡瀬勝: 出撃準備完了

--- breakで目標発見時にループを終了 ---
桐生一馬 を確認中...
真島吾朗 を確認中...
澤村遥 を確認中...
品田辰雄 を確認中...
品田辰雄 を発見しました。捜索を終了します
for_loop_vs_foreach.php
<?php
// forとforeachの使い分けを比較します

// 配列の全要素を順番に処理する場合は foreach が適しています
$characters = ["桐生一馬", "真島吾朗", "秋山駿", "冴島大河"];

echo "--- foreach(全要素を順番に処理) ---\n";
foreach ($characters as $index => $name) {
	echo ($index + 1) . ". " . $name . "\n";
}

// インデックスを使った逆順処理はforが適しています
echo "\n--- for(逆順で処理) ---\n";
$count = count($characters);
for ($i = $count - 1; $i >= 0; $i--) {
	echo ($count - $i) . ". " . $characters[$i] . "\n";
}

// 複数の配列を同時に参照する場合もforが適しています
echo "\n--- for(複数配列を同時に参照) ---\n";
$names = ["桐生一馬", "真島吾朗"];
$titles = ["嶋野組若頭補佐", "嶋野組若頭"];
$count2 = count($names);
for ($i = 0; $i < $count2; $i++) {
	echo $names[$i] . "(" . $titles[$i] . ")\n";
}

実行すると次のように出力されます。

php for_loop_vs_foreach.php
--- foreach(全要素を順番に処理) ---
1. 桐生一馬
2. 真島吾朗
3. 秋山駿
4. 冴島大河

--- for(逆順で処理) ---
1. 冴島大河
2. 秋山駿
3. 真島吾朗
4. 桐生一馬

--- for(複数配列を同時に参照) ---
桐生一馬(嶋野組若頭補佐)
真島吾朗(嶋野組若頭)

よくあるミス

ループ条件に count() を毎回呼び出す

条件式に count($array) を直接書くと、ループの繰り返しごとに count() が実行されます。配列が大きいほど無駄な処理が増えます。ループ前に変数に格納しておきます。

ng_for_count.php
<?php
$members = ["桐生一馬", "真島吾朗", "澤村遥", "品田辰雄", "渡瀬勝"];

// 条件式に count() を直接書くと繰り返しのたびに呼ばれる
for ($i = 0; $i < count($members); $i++) {
	echo $members[$i] . "\n";
}

実行すると次のように出力されます。

php ng_for_count.php
桐生一馬
真島吾朗
澤村遥
品田辰雄
渡瀬勝

ループの前に count() の結果を変数に格納しておきます。

ok_for_count.php
<?php
$members = ["桐生一馬", "真島吾朗", "澤村遥", "品田辰雄", "渡瀬勝"];

// ループ前に配列の長さを取得しておく
$count = count($members);
for ($i = 0; $i < $count; $i++) {
	echo $members[$i] . "\n";
}

実行すると次のように出力されます。

php ok_for_count.php
桐生一馬
真島吾朗
澤村遥
品田辰雄
渡瀬勝

無限ループを作ってしまう

条件式や更新式の書き方を誤ると、ループが終了しない無限ループになります。特にカウントダウンで終了条件を逆にした場合に起きやすいミスです。

ng_for_infinite.php
<?php
// $i-- で減らしているが、条件が $i < $count のため永遠に true になる
$count = 5;
for ($i = 0; $i < $count; $i--) { // $i-- を $i++ にすべきところ
	echo $i . "\n";
	if ($i < -100) break; // 無限ループを防ぐための緊急停止
}

実行すると次のように出力されます。

php ng_for_infinite.php
0
-1
-2
...(-100まで続く)

カウントアップとカウントダウンで条件式と更新式の向きを揃えます。

ok_for_infinite.php
<?php
// カウントアップ: 条件が $i < $count、更新が $i++
$count = 5;
for ($i = 1; $i <= $count; $i++) {
	echo "ラウンド " . $i . "\n";
}

// カウントダウン: 条件が $i >= 1、更新が $i--
for ($i = $count; $i >= 1; $i--) {
	echo "残り " . $i . " ラウンド\n";
}

実行すると次のように出力されます。

php ok_for_infinite.php
ラウンド 1
ラウンド 2
ラウンド 3
ラウンド 4
ラウンド 5
残り 5 ラウンド
残り 4 ラウンド
残り 3 ラウンド
残り 2 ラウンド
残り 1 ラウンド

概要

『for』文は初期化・条件・更新の3つの式をひとつにまとめたループ構文です。繰り返し回数が明確な場合や、カウンタ変数の値を処理の中で参照したい場合に適しています。初期化式はループ開始前に1度だけ実行され、条件式が『false』になった時点でループが終了します。

ループの途中で処理を制御したい場合は『break』と『continue』を使用します。『break』はループを即座に終了させるため、条件が成立した後の不要な繰り返しを防ぎます。『continue』は現在の繰り返しの残りをスキップするだけで、ループ自体は継続します。いずれも数値を付けることでネストしたループを複数段まとめて制御できます。

配列の全要素を順番に処理する場合は『foreach』のほうが記述がシンプルでミスが起きにくくなります。逆順・ステップ指定・複数配列の同時参照など、インデックスを明示的に操作したい場合に『for』を選択してください。配列の走査については『is_array() / in_array()』や『array_map() / array_filter()』も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。