浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

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

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

  • この記事いいね! (0)