概要
各列の合計 を出すのは、行合計 (ch06) より一段難しい。配列は「行 (= 内側配列) の並び」として持っているので、列方向に取り出すには 添字で列番号を固定して全行を走査する 必要がある。発想を「外側で列、内側で行」と入れ子の順を入れ替えるか、または $colSum[$j] のような列ごとの合計を貯める配列を用意して、行を回しながら加算する ことになる。
典型パターンは後者。$colSum = [0, 0, 0]; を用意しておき、foreach ($table as $row) { foreach ($row as $j => $value) { $colSum[$j] += $value; } } のように 内側 foreach のキー $j (列番号) を使って列ごとの合計を貯める。1 回のループで全列の合計が同時に組み立てられるので効率が良い。
この章では「全行が同じ列数である」ことが暗黙の前提になる。行ごとに列数がバラつく (ジャグ配列) と $colSum[$j] が未定義になったり、列数の取り方 (count($table[0]) を「1 行目基準」で取るのが普通) が壊れる。表として扱うなら全行同じ列数、というルールがここで効いてくる。ch11 の CSV パースでもこの前提を守ることで、列ごとの集計がきれいに繋がる。
学習目標
- 列ごとに合計値を計算できる
- 「外側で列、内側で行」と入れ子の順を入れ替える発想ができる
$colSum[$j]のような列ごとの合計を貯める配列で組み立てられる- 全行が同じ列数であることが前提になると理解する
ドリル
| no | 内容 |
|---|---|
| 01 | 3 行 3 列の配列の各列の合計を 3 行で出力 |
📝 演習: ドリル 01 — 各列の合計を出力
問題
次の 3×3 の 2 次元配列が与えられています。
$table = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];各 列 の合計を 1 行ずつ出力してください (左の列から順に)。
期待される出力:
12
15
18ヒント
- 外側
for ($j = 0; $j < 3; $j++)(列) - 内側
for ($i = 0; $i < 3; $i++)(行) - 加算は
$sum += $table[$i][$j];(行→列の順)