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

各列の合計を出す

テクノロジ系 / 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]; (行→列の順)