入れ子ループ
テクノロジ系 / loop (for / while / break / continue)
入れ子ループ
Lesson 3 / Chapter 5
ループの中にループを書ける
<?php
for ($i = 1; $i <= 3; $i++) {
for ($j = 1; $j <= 3; $j++) {
echo "$i-$j ";
}
echo "\n";
}実行結果:
1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3
動きを 1 ステップずつ追う
for ($i = 1; $i <= 3; $i++) { // 外側
for ($j = 1; $j <= 3; $j++) { // 内側
echo "$i-$j ";
}
echo "\n";
}- 外側
$i = 1の間に、内側$jが 1→2→3 と全部回る - 内側が終わったら外側が
$i = 2に進む - 内側がまた 1→2→3 と回る
- これを
$i = 3まで繰り返す
→ 内側ループは 外側 1 回ごとに最後まで 回る。
行 × 列の表を作る
<?php
for ($i = 1; $i <= 9; $i++) {
for ($j = 1; $j <= 9; $j++) {
echo $i * $j . " ";
}
echo "\n";
}- 外側 = 行
- 内側 = 列
- 内側ループの後ろに
echo "\n";を入れて改行
九九表のような格子状の出力は入れ子ループの定番。
図形を描く: 星のピラミッド
<?php
$n = 4;
for ($i = 1; $i <= $n; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo "*";
}
echo "\n";
}実行結果:
* ** *** ****
- 外側
$iが「行数」を決める - 内側
$jが$i回まで回るので、星の数が行ごとに増える
内側の条件は外側の変数を使ってよい
ピラミッドの例で見た通り:
for ($i = 1; $i <= $n; $i++) {
for ($j = 1; $j <= $i; $j++) { // ← 外側の $i を使っている
echo "*";
}
echo "\n";
}- 外側の
$iは内側からも見える - 内側の回数を外側の値で変えられる
このチャプターでできるようになること
✅ ループの中にループを書ける
✅ 内側ループが外側 1 回ごとに最後まで回ると分かる
✅ 行 × 列の表を出力できる
✅ 外側の変数を内側の条件に使える
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — 九九表 (1×1 〜 9×9)
問題
入れ子ループを使って、1 x 1 = 1 から 9 x 9 = 81 までの九九を 1 行ずつ全て (81 行) 出力してください。
出力の形は A x B = C (空白区切り)。
期待される出力 (先頭抜粋):
1 x 1 = 1 1 x 2 = 2 ... 1 x 9 = 9 2 x 1 = 2 2 x 2 = 4 ... 9 x 9 = 81
採点
php scripts/grade.php topics/loop/ch05-nested/drill/01-multiplication-table/
ヒント
- 外側
for ($i = 1; $i <= 9; $i++) - 内側
for ($j = 1; $j <= 9; $j++) - 内側で
echo "$i x $j = " . ($i * $j) . "\n";
ドリル 02 — 星のピラミッド (左寄せ)
問題
標準入力で整数 N を 1 行受け取り、左寄せの星 (*) のピラミッドを N 段出力してください。
入力例:
4
期待される出力:
* ** *** ****
採点
php scripts/grade.php topics/loop/ch05-nested/drill/02-stars/
ヒント
$n = (int) trim(fgets(STDIN));で N を読む- 外側
for ($i = 1; $i <= $n; $i++)で行数 - 内側
for ($j = 1; $j <= $i; $j++)で星の数 ($i個) - 内側で
echo "*";、内側を抜けたらecho "\n";