以下のファイルを用意する
test.php
<?php
$result = readCsv("sample.csv");
echo "---------------------------------------------------";
var_dump($result);
echo "---------------------------------------------------";
function readCsv($filePath){
$csvData = array();
if(!is_file($filePath)) {
return $csvData;
}
$file = new SplFileObject($filePath);
$file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY);
$header = array();
foreach ($file as $row_num => $row) {
if($row_num === 0) {
foreach($row as $col) {
$header[] = $col;
}
}
$record = array();
foreach($row as $col_num => $col) {
$record[$header[$col_num]] = $col;
}
$csvData[] = $record;
}
return $csvData;
}
sample.csv
date,score,message
2018/01/01,12000,"Good"
2018/01/02,8000,"Nice"
2018/01/03,25000,"Great"
実行結果
行番号とヘッダのカラム名からアクセスできるようにした
var_dumpで出力しているので以下のように表示される
---------------------------------------------------array(4) {
[0]=>
array(3) {
["date"]=>
string(4) "date"
["score"]=>
string(5) "score"
["message"]=>
string(7) "message"
}
[1]=>
array(3) {
["date"]=>
string(10) "2018/01/01"
["score"]=>
string(5) "12000"
["message"]=>
string(4) "Good"
}
[2]=>
array(3) {
["date"]=>
string(10) "2018/01/02"
["score"]=>
string(4) "8000"
["message"]=>
string(4) "Nice"
}
[3]=>
array(3) {
["date"]=>
string(10) "2018/01/03"
["score"]=>
string(5) "25000"
["message"]=>
string(9) "Great"
}
}
---------------------------------------------------
クラス化してヘッダの情報とレコード情報を別々に取り出したり、編集や書き出しができるようにするのもよい
説明
is_file($filePath)
csvファイルの存在チェック
foreach ($file as $row_num => $row)
最初の行はヘッダなのでカラム名を覚えておく
覚えておいたカラム名は各行の値を連想配列に格納する際に使用する
参考
PHP Documentation : is_file
PHP Documentation : SplFileObject