tohokuaikiのチラシの裏

技術的ネタとか。

PHPでCSVファイルを書き出す時にBOMを付けて改行コードをCRLFにする

Streamってあんまり使わない…

こんな感じ。

<?php
use App\Helpers\CrlfFilter;
# Streamを開く
$stream = fopen('php://output', 'w');
 # BOMを付ける
fputs($stream, pack('C*',0xEF,0xBB,0xBF));
# 改行コード変換フィルターを登録
stream_filter_register('CrlfFilter', CrlfFilter::class); 
# 登録したフィルターを適用
stream_filter_prepend($stream,'CrlfFilter', STREAM_FILTER_WRITE);
#データ書き込み
fputcsv($stream, [1,2,3];
# 終了
fclose($stream);

stream_filterって初めて使った。

ちなみにCrlfFilterは

こちらからコピペした

<?php
namespace App\Helpers;

/**
 * Class CrlfFilter
 * @package App\Helpers
 * @brief 改行コードをLFからCRLFにする
 */
class CrlfFilter extends \php_user_filter
{
    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = preg_replace("/\n$/", '', $bucket->data);
            $bucket->data = preg_replace("/\r$/", '', $bucket->data);
            $bucket->data = $bucket->data . "\r\n";
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}