入れ子 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のほうが読みやすい - 添字が要るなら
forかforeach ($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"; }