PHP for ループ
for ループは、特定のコードブロックを決められた回数だけ実行するための構造化された手段を提供します。コードを記述する前に、あらかじめループさせる回数が分かっている場合に特に有効で、タスクの繰り返しを正確にコントロールすることができます。
以前に学習した while や do-while ループ(これらは特定のビジネスロジックがいつ満たされるかに依存する傾向があります)とは異なり、for ループは、その「初期化」「条件判定」「インクリメント/デクリメント(更新)」という 3 つのコアステップを、構文構造の内部に明確に定義しているのが特徴です。
1. for ループの構文を解剖する
PHP における for ループの基本構造は、丸括弧内のセミコロン(;)で区切られた 3 つのエクスプレッション(式)と、それに続く実行されるコードブロックで構成されます。
for (初期化; 条件; インクリメント/デクリメント) {
// 各イテレーションで実行されるコード
}それぞれの要素を詳しく分解してみましょう:
- 初期化 (Initialization): このエクスプレッションは、ループの開始時に一度だけ実行されます。通常、ループのカウンタバリアブルを宣言し、初期化するために使用されます。
// 例:カウンタバリアブル $i を 0 に初期化
for ($i = 0; /* ... */) { }- 条件 (Condition): このエクスプレッションは、各イテレーション(反復)が始まる前に評価されます。条件が true であればループは継続し、false であればループは即座に終了します。
// 例:$i が 5 未満である限りループを継続
for (/* ... */; $i < 5; /* ... */) { }
```
* **インクリメント/デクリメント (Increment/Decrement):** このエクスプレッションは、各イテレーションの最後(コードブロックの実行完了後)に実行されます。通常、カウンタバリアブルを更新し、終了条件に一歩ずつ近づけるために使用されます。
```php
// 例:各イテレーションの後に $i を 1 増やす
for (/* ... */; /* ... */; $i++) { }
```
### 1.1 基本的な for ループの例
1 から 5 までの数字を表示する必要があると仮定しましょう。**for** ループはこのタスクに最適な制御構造です。
```php
<?php
for ($i = 1; $i <= 5; $i++) {
echo "現在の数字は:" . $i . "<br>";
}
?>この例の仕組み:
$i = 1によってカウンタ$iを 1 に初期化します。$i <= 5が条件です。$iが 5 以下である限り、ループは継続します。$i++によって各イテレーション後に$iを 1 インクリメントします。
出力結果:
現在の数字は:1
現在の数字は:2
現在の数字は:3
現在の数字は:4
現在の数字は:52. for ループのアドバンスドな活用シーン
基本構造はシンプルですが、for ループは極めて高い柔軟性を備えています。
2.1 複数の初期化または更新エクスプレッション
カンマで区切ることで、一つの for ループの中に複数の初期化やインクリメント/デクリメントのエクスプレッションを含めることができます。
<?php
// 例:2つのカウンタバリアブルを同時に使用
for ($i = 0, $j = 10; $i < 5; $i++, $j--) {
echo "i の値:" . $i . ",j の値:" . $j . "<br>";
}
?>ここでは、$i と $j が同時に初期化されます。各イテレーションごとに $i はインクリメントされ、$j はデクリメントされます。
出力結果:
i の値:0,j の値:10
i の値:1,j の値:9
i の値:2,j の値:8
i の値:3,j の値:7
i の値:4,j の値:62.2 エクスプレッションの省略
for ループの構文における 3 つのエクスプレッションはいずれも省略可能ですが、区切り記号のセミコロン(;)は必ず残す必要があります。もし「条件」エクスプレッションを省略した場合、デフォルトで true とみなされ、無限ループが発生します(コード内部で break ステートメントを使用して停止させない限り継続します)。
<?php
// 例:初期化と更新エクスプレッションを省略
$k = 1; // ループの外部で初期化
for (; $k <= 3;) { // ループ内部には条件エクスプレッションのみ
echo "ステップ:" . $k . "<br>";
$k++; // 更新ロジックをループ体の中に移動
}
?>これは、for ループが固定回数の反復のために設計されている一方で、その各コンポーネントを while ループのように外部やループ体内部で管理できる柔軟性があることを示しています。ただし、固定回数の反復においては、コードの明瞭性と可読性を保つため、3 つのコンポーネントすべてを for ループの括弧内に記述するのがベストプラクティスです。
3. 実戦ケーススタディ
3.1 階乗 (Factorial) の計算
for ループを使用して、ある数値の階乗(例:5!、つまり 5 * 4 * 3 * 2 * 1)を計算してみましょう。
<?php
$number = 5;
$factorial = 1; // 0を掛けると結果が常に0になるため、1に初期化します
// $number から 1 に向かってデクリメントしながらループ
for ($i = $number; $i >= 1; $i--) {
$factorial *= $i; // $factorial = $factorial * $i; と同等
echo "現在の乗算対象:" . $i . ",現在の階乗結果:" . $factorial . "<br>";
}
echo $number . " の階乗は:" . $factorial . "<br>";
?>出力結果:
現在の乗算対象:5,現在の階乗結果:5
現在の乗算対象:4,現在の階乗結果:20
現在の乗算対象:3,現在の階乗結果:60
現在の乗算対象:2,現在の階乗結果:120
現在の乗算対象:1,現在の階乗結果:120
5 の階乗は:1203.2 HTML テーブルのダイナミック生成
for ループは、テーブルの行や列といった、繰り返しの多い HTML 構造を生成するのに非常に適しています。
<?php
echo "<table border='1' style='border-collapse: collapse; text-align: center;'>";
echo "<thead><tr><th style='padding: 5px;'>行番号</th><th style='padding: 5px;'>平方根</th></tr></thead>";
echo "<tbody>";
// ループで 10 行のテーブルデータを生成
for ($row = 1; $row <= 10; $row++) {
$square = $row * $row;
echo "<tr>";
echo "<td style='padding: 5px;'>第 " . $row . " 行</td>";
echo "<td style='padding: 5px;'>" . $square . "</td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
?>このコードスニペットは、「行番号」と「平方根」の 2 列からなるシンプルな HTML テーブルを生成します。for ループは 10 回イテレーションを行い、そのたびに新しい行 <tr> と 2 つのセル <td> を作成します。