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]を加算