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

CSV を 2 次元配列にする

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

CSV を 2 次元配列にする

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 次元配列に組み立てられる

✅ 型変換でから合計などの計算に持ち込める

→ ドリルへ

考えてみよう

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

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

問題

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

入力例:

a,b,c
1,2,3

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

期待される出力:

a b c
1 2 3

採点

php scripts/grade.php topics/array-multi/ch11-csv-to-2d/drill/01-parse-csv/

ヒント

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

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

問題

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

入力例:

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

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

期待される出力:

12
15
18

採点

php scripts/grade.php topics/array-multi/ch11-csv-to-2d/drill/02-sum-csv-col/

ヒント

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