ch11 12章中 11章目

ch11 — 入力 CSV を 2 次元配列にする

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch11 — 入力 CSV を 2 次元配列にする」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch11 — 入力 CSV を 2 次元配列にする」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch11 — 入力 CSV を 2 次元配列にする」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

CSV (Comma-Separated Values) は 実務で最もよく出会うデータ形式 の 1 つ。Excel・Google スプレッドシート・DB のエクスポート・ログ・売上データなど、外部から渡されるデータはほぼこの形になる。CSV を PHP で扱う基本は「1 行ずつ標準入力で受け取り、explode(",", $line) でカンマ区切りに分解し、2 次元配列に組み立てる」というシンプルな流れだ。

組み立ての骨格は $rows = []; for ($i = 0; $i < $n; $i++) { $line = trim(fgets(STDIN)); $rows[] = explode(",", $line); }1 行読む → カンマで分割 → 2 次元配列に追加 を行数分くり返すだけ。trim で末尾の改行を取り除いてから explode するのがコツで、これを忘れると最後の要素に \n が混ざって数値変換に失敗するなどの しょっぱい事故 が起きる。要素を数値として扱いたいときは (int) などで明示的にキャストする。

2 次元配列に組み上がれば、あとは ch04〜ch07 で扱った 入れ子 foreach / 行合計 / 列合計 の手法がそのまま使える。ドリル 02 では「CSV → 2 次元配列 → 各列の合計」というパイプラインを通して、ばらばらに見えた章の知識が 1 本の処理として繋がる ことを体感する。これが「実務で動く PHP」の入口で、ここまで来れば自分でレポート集計スクリプトが書けるレベルになる。

学習目標

  • 標準入力で複数行を受け取り、各行を explode(",", $line) で分割できる
  • 分割結果を 2 次元配列に組み立てられる
  • 組み立てた 2 次元配列に対して、これまでの章 (合計など) を適用できる

ドリル

no 内容
01 CSV 入力を 2 行 3 列の配列にして表形式で出力
02 CSV 入力を 2 次元配列にして各列の合計を出力

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. CSV を 2 次元配列にする

    Lesson 6 / Chapter 11

  2. CSV の形を思い出す

    入力例:

    a,b,c
    1,2,3
    4,5,6
    • 1 行 = 1 レコード
    • , で列を区切る
    • これを 2 次元配列にすると [ ["a","b","c"], ["1","2","3"], ["4","5","6"] ]
  3. 1 行を分割する explode

    <?php
    $line = "1,2,3";
    $cols = explode(",", $line);
    print_r($cols);

    実行結果:

    Array ( [0] => 1 [1] => 2 [2] => 3 )
    • explode(区切り文字, 文字列) で文字列を配列に分割
    • 結果は 全て文字列 になる (数値が必要なら (int) で変換)
  4. 入力を 1 行ずつ読みながら配列に追加

    <?php
    $table = [];
    while (($line = fgets(STDIN)) !== false) {
        $line = rtrim($line, "\n");
        if ($line === "") continue;
        $cols = explode(",", $line);
        $table[] = $cols;
    }
    print_r($table);
    • fgets(STDIN) で 1 行読む (EOF で false)
    • $table[] = $cols で末尾に追加
    • これで 2 次元配列の完成
  5. 数値として扱いたいなら型変換

    <?php
    $table = [];
    while (($line = fgets(STDIN)) !== false) {
        $line = rtrim($line, "\n");
        if ($line === "") continue;
        $cols = explode(",", $line);
        $row = [];
        foreach ($cols as $c) {
            $row[] = (int) $c;
        }
        $table[] = $row;
    }
    • 合計や平均を出すなら、文字列のままだと計算がおかしくなる
    • (int)$c で整数に変換してから追加
  6. 組み立てたら、後はこれまでの章と同じ

    // 各行の合計
    foreach ($table as $row) {
        echo array_sum($row) . "\n";
    }
    
    // 各列の合計
    $cols = count($table[0]);
    for ($j = 0; $j < $cols; $j++) {
        $sum = 0;
        foreach ($table as $row) {
            $sum += $row[$j];
        }
        echo $sum . "\n";
    }
    • 入力を整え終われば、ch06 / ch07 と同じ処理がそのまま使える
  7. このチャプターでできるようになること

    fgets(STDIN) で複数行入力を読める ✅ explode(",", $line) で 1 行を配列に分割できる ✅ $table[] = $cols で 2 次元配列に組み立てられる ✅ 型変換でから合計などの計算に持ち込める

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

Lesson 6 / Chapter 11


CSV の形を思い出す

入力例:

a,b,c
1,2,3
4,5,6
  • 1 行 = 1 レコード
  • , で列を区切る
  • これを 2 次元配列にすると [ ["a","b","c"], ["1","2","3"], ["4","5","6"] ]

1 行を分割する explode

<?php
$line = "1,2,3";
$cols = explode(",", $line);
print_r($cols);

実行結果:

Array ( [0] => 1 [1] => 2 [2] => 3 )
  • explode(区切り文字, 文字列) で文字列を配列に分割
  • 結果は 全て文字列 になる (数値が必要なら (int) で変換)

入力を 1 行ずつ読みながら配列に追加

<?php
$table = [];
while (($line = fgets(STDIN)) !== false) {
    $line = rtrim($line, "\n");
    if ($line === "") continue;
    $cols = explode(",", $line);
    $table[] = $cols;
}
print_r($table);
  • fgets(STDIN) で 1 行読む (EOF で false)
  • $table[] = $cols で末尾に追加
  • これで 2 次元配列の完成

数値として扱いたいなら型変換

<?php
$table = [];
while (($line = fgets(STDIN)) !== false) {
    $line = rtrim($line, "\n");
    if ($line === "") continue;
    $cols = explode(",", $line);
    $row = [];
    foreach ($cols as $c) {
        $row[] = (int) $c;
    }
    $table[] = $row;
}
  • 合計や平均を出すなら、文字列のままだと計算がおかしくなる
  • (int)$c で整数に変換してから追加

組み立てたら、後はこれまでの章と同じ

// 各行の合計
foreach ($table as $row) {
    echo array_sum($row) . "\n";
}

// 各列の合計
$cols = count($table[0]);
for ($j = 0; $j < $cols; $j++) {
    $sum = 0;
    foreach ($table as $row) {
        $sum += $row[$j];
    }
    echo $sum . "\n";
}
  • 入力を整え終われば、ch06 / ch07 と同じ処理がそのまま使える

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

fgets(STDIN) で複数行入力を読める ✅ explode(",", $line) で 1 行を配列に分割できる ✅ $table[] = $cols で 2 次元配列に組み立てられる ✅ 型変換でから合計などの計算に持ち込める

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — CSV を 2 次元配列にして表形式で出力 README.md answer.php
  2. 02 ドリル 02 — CSV を読んで各列の合計を出力 README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — CSV を 2 次元配列にして表形式で出力

問題

標準入力で次のような CSV (2 行 3 列) が与えられます。

入力例:

a,b,c
1,2,3

これを explode で 2 次元配列に組み立て、各行を 空白区切り で 1 行に出力してください。

期待される出力:

a b c
1 2 3

ヒント

  • while (($line = fgets(STDIN)) !== false) { ... } で 1 行ずつ読む
  • rtrim($line, "\n") で末尾改行を除去
  • $table[] = explode(",", $line);
  • foreach ($table as $row) echo implode(" ", $row) . "\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — CSV を読んで各列の合計を出力

問題

標準入力で次のような数値 CSV (3 行 3 列) が与えられます。

入力例:

1,2,3
4,5,6
7,8,9

これを 2 次元配列にし、各列の合計 を 1 行ずつ (左の列から順に) 出力してください。

期待される出力:

12
15
18

ヒント

  • 1 行ずつ fgets(STDIN) で読み、explode(",", $line) で分割
  • 数値計算するので各要素は (int) で整数に変換
  • 列数を取って外側 for $j、内側で全行の $row[$j] を加算

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — CSV を 2 次元配列にして表形式で出力

    README.md answer.php

  2. ドリル 02 — CSV を読んで各列の合計を出力

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます