PHPには CSV 文字列を配列にする関数があります。配列を CSV ファイルにする関数もあります。 しかし配列を CSV 文字列にする関数はありません。
PHP: str_getcsv – Manual
PHP: fputcsv – Manual
この関数は次の様に実装できます。
/**
* 二次元配列をCSV文字列化
* @param iterable $lines string[][]を想定
* @param string $delimiter
* @param string $enclosure
* @return string
*/
function csv2str(iterable $lines, string $delimiter = ',', string $enclosure = '"'): string
{
// 配列を CSV ファイルにする関数を利用して一時ファイルに CSV 文字列を書き込み
// @see https://www.php.net/manual/ja/wrappers.php.php
// @see https://www.php.net/manual/ja/function.fopen.php
// @see https://www.php.net/manual/ja/function.fputcsv.php
// この時点でファイルポインタは先頭
$fp = fopen('php://temp', 'rb+');
foreach ($lines as $line) {
fputcsv($fp, $line, $delimiter, $enclosure);
}
// この時点でファイルポインタは末尾。中間には書き込まれた CSV 文字列が貯まっています
// ファイルポインタの位置を先頭に戻します
// @see https://www.php.net/manual/ja/function.rewind.php
rewind($fp);
// 先頭から順に一時ファイルの中を終端まで読んで、中身を文字列型の変数に入れます
// @see https://www.php.net/manual/ja/function.fread.php
// @see https://www.php.net/manual/ja/function.feof.php
// @see https://www.php.net/manual/ja/function.fclose.php
$csv = '';
while (! feof($fp)) {
$csv .= fread($fp, 8192);
}
// 役目が終わったリソースを閉じます(PHP は賢いので参照できなくなった時点で勝手に閉じてくれる気もしますが一応)
fclose($fp);
// 結果を返して終了
return $csv;
}
このファイルめがけて逐次書き込む何かを php://temp に向けて動かした後に、それを先頭から読み込む、という戦略はストリームと文字列まで役割を抽象化できるので色々応用の余地があり案外便利です。