PHP - BASIC - 5. PHPの反復構造 - 5. ネストしたループ

while 文や for 文のような反復構造の中に、また別の反復構造を定義することもできます。このような構造をネストしたループなどと呼びます。ここでは次のプログラム( loop6.php )を作成してみましょう。

<?php
for ($i = 0; $i < 3; $i++) {
  for ($j = 0; $j < 3; $j++) {
    echo $i + $j;
    echo " ";
  }
  echo PHP_EOL;
}

このプログラムでは外側の for 文でカウンター変数 $i の値が 3 より小さい間、処理を繰り返すように定義してます。またfor文の処理ブロック {} の中では、もう一つ別の for 文を定義しており、カウンター変数を $j とし、 $j3 より小さい間、処理を繰り返すように定義しています。

このように for 文がネストする場合は、ネストした内側の for 文のカウンター変数に $i を使うことができないため、 $j のような名前を付けることが多いです。

ネストした for 文の実行時の処理の流れをまとめると次のようになります。

変数 $i 変数 $j echo $i + $j による出力
0 0 0
0 1 1
0 2 2
1 0 1
1 1 2
1 2 3
2 0 2
2 1 3
2 2 4

上記の表を見ると $i0 の時点で内側の for 文の $j0〜2 までループします。次に外側の for 文の $i がインクリメントされて $i1 となり、内側の for 文の $j0〜2 までループします。さらに外側の for 文の $i がインクリメントされて $i2 となり、内側の for 文の $j0〜2 までループします。

それではプログラムを実行してみましょう。

$ php loop6.php
0 1 2 
1 2 3 
2 3 4 

まとめ

  • 反復構造の中で反復構造を定義できる
  • このような入れ子構造をネストと呼ぶ
  • ネストした反復構造のカウンター変数には $i$j$k と名前をつけることが一般的