【PHP】配列をCSV文字列にする

  • 2021年10月28日
  • PHP

 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 に向けて動かした後に、それを先頭から読み込む、という戦略はストリームと文字列まで役割を抽象化できるので色々応用の余地があり案外便利です。
 

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG