Edited at

PHP: str_putcsv

PHPにはCSV文字列をパースして配列にするstr_getcsv関数があるが、これとは逆の配列をCSV文字列に変換する関数が存在しない。

ファイル
文字列

CSV→配列
fgetcsv()
str_getcsv()

配列→CSV
fputcsv()
存在しない

仕方がないので、str_putcsvは自作した。

/**

* @param string[] $record
* @return bool|string
*/

function str_putcsv(
array $record,
?string $delimiter = null,
?string $enclosure = null
) {
$delimiter = $delimiter ?? ',';
$enclosure = $enclosure ?? '"';
$fp = fopen('php://memory', 'r+b');
if ($fp === false) {
return false;
}
if (fputcsv($fp, $record, $delimiter, $enclosure, "\0") === false) {
return false;
}
if (!rewind($fp)) {
return false;
}
return stream_get_contents($fp);
}

実装内容は下記参考文献とほとんど同じだけど、ちょっと良くした部分として、


  • 型宣言をちゃんとした


  • fputcsv()の第5引数 $escape_char のデフォルトは \ だが、これをそのままにしておくと \"\"" にならない謎仕様を抑制するためにヌルバイトを与えておくようにした。(ヌルバイト+エンクロージャのパターンが扱うデータにないことを前提としている)


  • fputcsvに習って、エラーのときはfalseを返すようにした

という点がある。

動かしてみる:

echo str_putcsv(['a', 'b', ',', '"', '\"']);

出力結果:

a,b,",","""","\"""


参考文献