ch05 6章中 5章目

ch05 — 入れ子ループ

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch05 — 入れ子ループ」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch05 — 入れ子ループ」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch05 — 入れ子ループ」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

ループは 入れ子 にできる。for の中にもう 1 つ for を書くと、外側が 1 回回るたびに内側のループが最初から最後まで全部回る、という二重構造になる。これは「表のような 2 次元データ」を扱うときに必須のテクニックで、九九表 (9 行 × 9 列)、星のピラミッド (行ごとに違う数の *)、行列演算、画像のピクセル走査など、現実のプログラミングで出てくる場面は数えきれない。

文法的には外側のループのカウンタを $i、内側を $j にする慣習がある。これは「i と j で区別がつきやすい」「両方とも $i だと内側が外側のカウンタを破壊して バグになる」という実害から来ている。3 重ループになれば $k、それ以上は名前を意味のあるもの ($row / $col / $layer 等) に切り替える、と段階的にスケールしていく。

入れ子で必ず意識すべきが 計算量 だ。外側が N 回・内側が M 回回るループは、本体が合計 N × M 回 実行される。N = M = 1000 なら 100 万回、10000 なら 1 億回。N が増えるほど一気に重くなるので、「これは本当に N × M 必要か」「片方は N 回で済まないか」を常に問う癖が、後の配列・アルゴリズムの章で効いてくる。入れ子ループは強力だが、雑に書くと簡単に重いコードになるという両刃の剣だと覚えておくと良い。

学習目標

  • ループの中にループを書ける
  • 内側のループが「外側 1 回ごとに最後まで回る」と理解する
  • 表 (行 × 列) や図形を出力できる

ドリル

no 内容
01 1×1 から 9×9 までの九九表 (81 行) を出力
02 入力 N で N 段の星 (*) のピラミッドを出力

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. 入れ子ループ

    Lesson 3 / Chapter 5

  2. ループの中にループを書ける

    <?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
  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 回ごとに最後まで 回る。

  4. 行 × 列の表を作る

    <?php
    for ($i = 1; $i <= 9; $i++) {
        for ($j = 1; $j <= 9; $j++) {
            echo $i * $j . " ";
        }
        echo "\n";
    }
    • 外側 = 行
    • 内側 = 列
    • 内側ループの後ろに echo "\n"; を入れて改行

    九九表のような格子状の出力は入れ子ループの定番。

  5. 図形を描く: 星のピラミッド

    <?php
    $n = 4;
    for ($i = 1; $i <= $n; $i++) {
        for ($j = 1; $j <= $i; $j++) {
            echo "*";
        }
        echo "\n";
    }

    実行結果:

    *
    **
    ***
    ****
    • 外側 $i が「行数」を決める
    • 内側 $j$i 回まで回るので、星の数が行ごとに増える
  6. 内側の条件は外側の変数を使ってよい

    ピラミッドの例で見た通り:

    for ($i = 1; $i <= $n; $i++) {
        for ($j = 1; $j <= $i; $j++) {  // ← 外側の $i を使っている
            echo "*";
        }
        echo "\n";
    }
    • 外側の $i は内側からも見える
    • 内側の回数を外側の値で変えられる
  7. このチャプターでできるようになること

    ✅ ループの中にループを書ける ✅ 内側ループが外側 1 回ごとに最後まで回ると分かる ✅ 行 × 列の表を出力できる ✅ 外側の変数を内側の条件に使える

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

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 回ごとに最後まで回ると分かる ✅ 行 × 列の表を出力できる ✅ 外側の変数を内側の条件に使える

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — 九九表 (1×1 〜 9×9) README.md starter.php answer.php
  2. 02 ドリル 02 — 星のピラミッド (左寄せ) README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 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

ヒント

  • 外側 for ($i = 1; $i <= 9; $i++)
  • 内側 for ($j = 1; $j <= 9; $j++)
  • 内側で echo "$i x $j = " . ($i * $j) . "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — 星のピラミッド (左寄せ)

問題

標準入力で整数 N を 1 行受け取り、左寄せの星 (*) のピラミッドを N 段出力してください。

入力例:

4

期待される出力:

*
**
***
****

ヒント

  • $n = (int) trim(fgets(STDIN)); で N を読む
  • 外側 for ($i = 1; $i <= $n; $i++) で行数
  • 内側 for ($j = 1; $j <= $i; $j++) で星の数 ($i 個)
  • 内側で echo "*";、内側を抜けたら echo "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — 九九表 (1×1 〜 9×9)

    README.md starter.php answer.php

  2. ドリル 02 — 星のピラミッド (左寄せ)

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます