概要

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 のように意味のある名前にする と、何をしているか後から読み返しやすい。

学習目標

ドリル

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

演習: ドリル 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

ヒント

この章を AI に聞く

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

    💬 ChatGPT 📘 Claude ✨ Gemini

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

    💬 ChatGPT 📘 Claude ✨ Gemini

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

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch04 — 入れ子 foreach で全走査」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE