fputcsv 備忘録

PHP5から利用可能になった、CSVファイルを生成~出力する fputcsv 関数。今改めてオンラインマニュアルの関数リファレンスを読んでみればはっきりと書いてあることなんですが、実際に使ってみないと意外とよく分からないので、ハマりがちな点……というか実際に自分がハマった点を合わせて fputcsv の使い方をメモ。

関数リファレンス冒頭にははっきりと行を CSV 形式にフォーマットし、ファイルポインタに書き込むと書いてあるのですが、使う側としては出力したいCSVファイルが一行だけで構成されてるなんてことはそうそうないので、初めて使う際にはマニュアルのサンプルコードが foreach を使って一行ずつ処理してることをすっぽかして、$list が二次元配列になってるのだけを見て「全部良きに計らってくれるのかな?」と思い込みがちです。

要は

<?php
$values = array(
    array("1A", "1B", "1C", "1D"),
    array("2A", "2B", "2C", "2D"),
    array("3A", "3B", "3C", "3D")
);

$in = fopen("result.csv", "w");

fputcsv($in, $values);

fclose($in);

で result.csv には

1A,1B,1C,1D
2A,2B,2C,2D
3A,3B,3C,3D

と出力されるのを期待しちゃうのですが、実際に出力されるのは

array,array,array

だったりします。実際に期待する結果を出すには、

<?php
$values = array(
    array("1A", "1B", "1C", "1D"),
    array("2A", "2B", "2C", "2D"),
    array("3A", "3B", "3C", "3D")
);

$in = fopen("result.csv", "w");

foreach ($values as $line) {
    fputcsv($in, $line);
}

fclose($in);

とします。