多次元配列の総合演習
テクノロジ系 / 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でそのまま整数として表示される