概要
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 行ずつ出力 |
📝 演習: ドリル 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"; }