PHPでCSVを読込、処理したい場合が度々ある。
今までは「fgetcsv」関数や「file」関数を使用して処理していましたが、別の方法を発見。こりゃあ便利。

PHP5.1.0以上の環境では、CSVファイルを読み込むためのSplFileObjectクラスが用意されているらしい。

CSV

data01,data02,data03,data04,data05
data06,data07,data08,data09,data10
data11,data12,data13,data14,data15

SplFileObject

1行ずつ配列で取得できるのでラク。

$file = "sample.csv";
$file = new SplFileObject($file);
$file->setFlags(
    \SplFileObject::READ_CSV |           
    \SplFileObject::READ_AHEAD |       
    \SplFileObject::SKIP_EMPTY |       
    \SplFileObject::DROP_NEW_LINE 
);

$array = array();   // 配列を用意

foreach ($file as $data) {
    error_log(print_r($data, true));
    $array[] = $data;   // 配列の最後に配列を追加
}

fgetcsv

あんまり大差ない…?

$file = "sample.csv";
$fp = fopen($file, 'r');
 
$array = array();   // 配列を用意

// fgetcsvでファイルのデータを読み込む
while($data = fgetcsv($fp)){
    $array[] = $data;
}
  
fclose($fp);    // 閉じる

実行結果

var_dump($array);

array(3) {
  [0]=>
  array(5) {
    [0]=>
    string(9) "data01"
    [1]=>
    string(6) "data02"
    [2]=>
    string(6) "data03"
    [3]=>
    string(6) "data04"
    [4]=>
    string(6) "data05"
  }
  [1]=>
  array(5) {
    [0]=>
    string(6) "data06"
    [1]=>
    string(6) "data07"
    [2]=>
    string(6) "data08"
    [3]=>
    string(6) "data09"
    [4]=>
    string(6) "data10"
  }
  [2]=>
  array(5) {
    [0]=>
    string(6) "data11"
    [1]=>
    string(6) "data12"
    [2]=>
    string(6) "data13"
    [3]=>
    string(6) "data14"
    [4]=>
    string(6) "data15"
  }
}

参考

PHP: SplFileObject – Manual

PHP: fgetcsv – Manual