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

多次元配列の総合演習

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

多次元配列の総合演習

Lesson 6 / Chapter 12

入力データを「表」として持つ

例として「学生 3 人 × 3 教科の点数」を考える。

入力例:

太郎,80,70,90
花子,60,85,75
次郎,90,65,80
  • 1 行 = 1 人分のデータ
  • 名前 + 3 教科の点数

→ 「行 = 学生」「列 = 教科」と見れば、ch01〜ch11 でやってきた表と同じ。

オブジェクトリストに組み立てる

<?php
$students = [];
while (($line = fgets(STDIN)) !== false) {
    $line = rtrim($line, "\n");
    if ($line === "") continue;
    $cols = explode(",", $line);
    $students[] = [
        'name' => $cols[0],
        'scores' => [(int)$cols[1], (int)$cols[2], (int)$cols[3]],
    ];
}
  • 名前は文字列のまま、点数は整数に変換
  • 1 件分を連想配列 (name + scores) にして配列に追加

各学生の平均 = 行方向の集計

<?php
foreach ($students as $s) {
    $avg = array_sum($s['scores']) / count($s['scores']);
    echo $s['name'] . ": " . $avg . "\n";
}
  • 1 件 (1 行) の中で array_sum / count
  • ch06 (各行の合計) の発展

教科ごとのクラス平均 = 列方向の集計

<?php
$subjects = count($students[0]['scores']);   // 3
for ($j = 0; $j < $subjects; $j++) {
    $sum = 0;
    foreach ($students as $s) {
        $sum += $s['scores'][$j];
    }
    $avg = $sum / count($students);
    echo $avg . "\n";
}
  • 外側 = 教科 (列)、内側 = 学生 (行)
  • ch07 (各列の合計) の発展

集計結果を組み合わせると「成績表」になる

  • 名前 + 平均 → 個人成績
  • 教科ごとの平均 → クラス全体の弱点
  • 両方を組み合わせれば、教科別の偏りや個人の得意分野が見える

ここまで来れば、簡易的な集計プログラムは多次元配列だけで十分作れる。

このチャプターでできるようになること

✅ 入力をオブジェクトリストや 2 次元配列に組み立てられる

✅ 行方向 (各人の平均) と列方向 (各教科のクラス平均) を使い分けられる

✅ ch01〜ch11 を組み合わせて 1 つのプログラムにまとめられる

→ ドリルへ

考えてみよう

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

ドリル 01 — 各学生の平均点を出力

問題

標準入力で 3 行のデータが与えられます。各行は次の形式です。

名前,国語の点,数学の点,英語の点

入力例:

太郎,80,70,90
花子,60,90,90
次郎,100,100,70

各学生について、3 教科の 平均点 を計算し、次の形で 1 行ずつ出力してください。

名前: 平均

期待される出力:

太郎: 80
花子: 80
次郎: 90

採点

php scripts/grade.php topics/array-multi/ch12-summary/drill/01-student-grades/

ヒント

  • 1 行ずつ fgets(STDIN) で読み、explode(",", $line) で分割
  • 1 件分を ['name' => ..., 'scores' => [...]] のような連想配列にして配列に追加
  • array_sum($scores) / count($scores) で平均
  • 今回は割り切れる点数になっているので、echo $avg でそのまま整数として表示される

ドリル 02 — 教科ごとのクラス平均を出力

問題

標準入力で 3 行のデータが与えられます。各行は次の形式です。

名前,国語の点,数学の点,英語の点

入力例:

太郎,60,80,100
花子,90,80,70
次郎,90,80,100

各教科のクラス平均 (3 人の平均) を計算し、国語 → 数学 → 英語 の順に 1 行ずつ出力してください。

期待される出力:

80
80
90

採点

php scripts/grade.php topics/array-multi/ch12-summary/drill/02-class-average/

ヒント

  • 各行を 2 次元配列に組み立てる (名前は無視してよいし、'scores' キーに点数だけ入れてもよい)
  • 外側 = 教科 (列)、内側 = 学生 (行) で for ループ
  • 各教科について $sum += $row[$j]; し、最後に学生数で割る
  • 今回は割り切れる点数になっているので echo $avg でそのまま整数として表示される