ch04 12章中 4章目

ch04 — 入れ子 foreach で全走査

スライドで見る

この章を AI と学ぶ

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

    ChatGPT Claude Gemini

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

    ChatGPT Claude Gemini

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

    ChatGPT Claude Gemini

概要

2 次元配列の 全要素 に同じ処理をかけたい時は、foreach を入れ子 にする。外側の foreach で 1 行ずつ取り出し、その行 (= 1 次元配列) に対して内側の foreach で 1 マスずつ取り出す、という 2 段構造になる。foreach ($table as $row) { foreach ($row as $cell) { ... } } という形を覚えるだけで、添字を意識せずに全マスを処理できるようになる。

この書き方の利点は、行数も列数も気にせず動く こと。for ($i = 0; $i < count($table); $i++)for ($j = 0; $j < count($table[$i]); $j++) の入れ子でも同じことができるが、長さの取り扱いを間違えやすい。foreach にしておけば「配列の中にあるものを全部処理する」が一文で表現でき、ジャグ配列 (行ごとに長さが違う) でも崩れない。

計算量は 行数 × 列数 (O(N×M)) で、行が増えても列が増えても比例して処理時間が伸びる。少ない要素ならまったく問題ないが、ch05 (表整形) / ch06 (行合計) / ch07 (列合計) など今後の章はすべてこの入れ子 foreach が骨格になる。外側を as $row、内側を as $cell のように意味のある名前にする と、何をしているか後から読み返しやすい。

学習目標

  • 外側 foreach で行を、内側 foreach で各マスを取り出せる
  • 添字を意識せずに 2 次元配列を全走査できる
  • 入れ子 foreach の構造を読める

ドリル

no 内容
01 3×3 配列を入れ子 foreach で 1 マス 1 行ずつ出力

解説スライド 全 6 枚

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

  1. 入れ子 foreach で全走査

    Lesson 6 / Chapter 4

  2. 外側 foreach で「1 行ずつ」取り出す

    <?php
    $table = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ];
    foreach ($table as $row) {
        print_r($row);
    }
    • foreach ($table as $row) で 1 行分の配列が $row に入る
    • $row 自体がまだ配列 (内側の [1, 2, 3] 等)
    • もう 1 段 foreach すれば中の値を取り出せる
  3. 内側 foreach で「1 マスずつ」取り出す

    <?php
    $table = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ];
    foreach ($table as $row) {
        foreach ($row as $value) {
            echo $value . "\n";
        }
    }

    実行結果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    • 外側 $row = 1 行分の配列
    • 内側 $value = その行の 1 マスの値
  4. for ループとの違い

    // for 版 (添字を自分で回す)
    for ($i = 0; $i < count($table); $i++) {
        for ($j = 0; $j < count($table[$i]); $j++) {
            echo $table[$i][$j] . "\n";
        }
    }
    
    // foreach 版 (添字を気にしない)
    foreach ($table as $row) {
        foreach ($row as $value) {
            echo $value . "\n";
        }
    }
    • 添字が要らないなら foreach のほうが読みやすい
    • 添字が要るなら forforeach ($arr as $i => $row) を使う
  5. 行の区切りを入れたいなら

    <?php
    foreach ($table as $row) {
        foreach ($row as $value) {
            echo $value . " ";
        }
        echo "\n";   // 行の終わりに改行
    }

    実行結果:

    1 2 3
    4 5 6
    7 8 9
    • 内側 foreach の 後ろ で改行を入れると、表のように見える
    • これは次の章 (ch05) で詳しく扱う
  6. このチャプターでできるようになること

    ✅ 外側 foreach で 1 行ずつ取り出せる ✅ 内側 foreach で 1 マスずつ値を取り出せる ✅ 入れ子 foreach で 2 次元配列を全走査できる ✅ for 版と foreach 版の使い分けが分かる

    → ドリルへ

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

Lesson 6 / Chapter 4


外側 foreach で「1 行ずつ」取り出す

<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
foreach ($table as $row) {
    print_r($row);
}
  • foreach ($table as $row) で 1 行分の配列が $row に入る
  • $row 自体がまだ配列 (内側の [1, 2, 3] 等)
  • もう 1 段 foreach すれば中の値を取り出せる

内側 foreach で「1 マスずつ」取り出す

<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
foreach ($table as $row) {
    foreach ($row as $value) {
        echo $value . "\n";
    }
}

実行結果:

1
2
3
4
5
6
7
8
9
  • 外側 $row = 1 行分の配列
  • 内側 $value = その行の 1 マスの値

for ループとの違い

// for 版 (添字を自分で回す)
for ($i = 0; $i < count($table); $i++) {
    for ($j = 0; $j < count($table[$i]); $j++) {
        echo $table[$i][$j] . "\n";
    }
}

// foreach 版 (添字を気にしない)
foreach ($table as $row) {
    foreach ($row as $value) {
        echo $value . "\n";
    }
}
  • 添字が要らないなら foreach のほうが読みやすい
  • 添字が要るなら forforeach ($arr as $i => $row) を使う

行の区切りを入れたいなら

<?php
foreach ($table as $row) {
    foreach ($row as $value) {
        echo $value . " ";
    }
    echo "\n";   // 行の終わりに改行
}

実行結果:

1 2 3
4 5 6
7 8 9
  • 内側 foreach の 後ろ で改行を入れると、表のように見える
  • これは次の章 (ch05) で詳しく扱う

このチャプターでできるようになること

✅ 外側 foreach で 1 行ずつ取り出せる ✅ 内側 foreach で 1 マスずつ値を取り出せる ✅ 入れ子 foreach で 2 次元配列を全走査できる ✅ for 版と foreach 版の使い分けが分かる

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — 入れ子 foreach で全要素を 1 行ずつ出力 README.md starter.php answer.php

演習問題の詳細

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

ドリル 01 — 入れ子 foreach で全要素を 1 行ずつ出力

問題

次の 3×3 の 2 次元配列が与えられています。

$table = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90],
];

入れ子 foreach を使って、全ての要素を 1 行ずつ順に出力してください。 for ではなく foreach を使ってください。

期待される出力:

10
20
30
40
50
60
70
80
90

ヒント

  • 外側: foreach ($table as $row) { ... }
  • 内側: foreach ($row as $value) { echo $value . "\n"; }

🧪 ブラウザで試す

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

PHP ランタイム未読込

          

        

演習問題(1問)

  1. ドリル 01 — 入れ子 foreach で全要素を 1 行ずつ出力

    README.md starter.php answer.php

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

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