採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

入れ子 foreach で全走査

テクノロジ系 / array-multi (多次元配列・オブジェクトリスト・CSV)

入れ子 foreach で全走査

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 版の使い分けが分かる

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

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

採点

php scripts/grade.php topics/array-multi/ch04-2d-foreach/drill/01-flatten/

ヒント

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