各列の合計を出す
テクノロジ系 / array-multi (多次元配列・オブジェクトリスト・CSV)
各列の合計を出す
Lesson 6 / Chapter 7
行ではなく「列」で合計したい
$table = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];- 列 0 の合計 = 1 + 4 + 7 = 12
- 列 1 の合計 = 2 + 5 + 8 = 15
- 列 2 の合計 = 3 + 6 + 9 = 18
→ 「外側で列番号 $j、内側で行番号 $i」と入れ子の順を入れ替える。
for を入れ替えた書き方
<?php
$table = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
$cols = count($table[0]); // 列数 = 3
$rows = count($table); // 行数 = 3
for ($j = 0; $j < $cols; $j++) {
$sum = 0;
for ($i = 0; $i < $rows; $i++) {
$sum += $table[$i][$j]; // 行 $i、列 $j
}
echo $sum . "\n";
}実行結果:
12 15 18
添字の順をよく確認
$table[$i][$j]
$i= 行番号 (どの行か)$j= 列番号 (その行の何番目か)
外側を $j (列) にしても、配列にアクセスする時は 行→列の順 で書く。
ここを $table[$j][$i] と書くと別の場所を読んでしまう。
全行が同じ列数である前提
$jagged = [
[1, 2, 3],
[4, 5],
[7, 8, 9, 10],
];- 上の例では「列 2 の合計」を出そうとすると、2 行目には列 2 が無くて壊れる
- 「列ごとの合計」を出したいときは、全行の列数が揃っている前提を確認
- 揃っていなければ、まず形を整える (本章では扱わない)
このチャプターでできるようになること
✅ 列ごとの合計を 1 列 1 行ずつ出力できる
✅ 外側ループ = 列、内側ループ = 行、と順を入れ替えられる
✅ $table[$i][$j] の添字の順を間違えない
✅ 全行が同じ列数である前提を意識できる
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — 各列の合計を出力
問題
次の 3×3 の 2 次元配列が与えられています。
$table = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];各 列 の合計を 1 行ずつ出力してください (左の列から順に)。
期待される出力:
12 15 18
採点
php scripts/grade.php topics/array-multi/ch07-col-sum/drill/01-each-col-sum/
ヒント
- 外側
for ($j = 0; $j < 3; $j++)(列) - 内側
for ($i = 0; $i < 3; $i++)(行) - 加算は
$sum += $table[$i][$j];(行→列の順)