フィールドの配列を CSV の行として書き出す

# SplFileObject::fputcsv

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

SplFileObject::fputcsv — フィールドの配列を CSV の行として書き出す

### 説明

public function SplFileObject::fputcsv(
array `$fields`,
string `$separator` = ",",
string `$enclosure` = "\"",
string `$escape` = "\\",
string `$eol` = "\n"
): int|false

`fields` の配列を、CSV の行としてファイルに書き出します。

### パラメータ

`fields`

  値の配列。

`separator`

  フィールドの区切り文字 (シングルバイト文字 1 文字のみ)。 デフォルトはカンマ(`,`)、 もしくは事前に SplFileObject::setCsvControl() を呼び出してセットされた値です。

`enclosure`

  フィールド囲み文字 (シングルバイト文字 1 文字のみ)。 デフォルトはダブルクォート(`"`)、もしくは事前に SplFileObject::setCsvControl() を呼び出してセットされた値です。

`escape`

  エスケープ文字 (シングルバイト文字 最大で1文字)。 デフォルトはバックスラッシュ(`\`)、 もしくは事前に SplFileObject::setCsvControl() を呼び出してセットされた値です。 空文字列(`""`)の場合、(RFC 4180 に準拠していない) 独自仕様のエスケープ機構が無効になります。

  警告

  入力ストリームにおいて、`enclosure` 文字は クォートされた文字列の中で2回連続させることで常にエスケープでき、 パース結果では単一の `enclosure` 文字になります。 `escape` 文字の動作は異なります: 入力中に `escape` と `enclosure` 文字の並びが出現した場合、 パース結果には両方の文字がそのまま残ります。 よって、デフォルトのパラメータの場合、 `"a""b","c\"d"` のような CSV の行は それぞれ `a"b` と `c\"d` にパースされます。

  警告

  PHP 8.4.0 以降では、`escape` のデフォルト値に依存することは非推奨となりました。 位置指定の引数か、名前付き引数を使用するか、 あるいは SplFileObject::setCsvControl() を呼び出して、明示的に指定する必要があります。

`eol`

  `eol` は、 カスタムの行末シーケンスを設定するオプションの引数です。

警告

`escape` が空の文字列(`""`)以外に設定されているとき、 » RFC 4180 に準拠しない CSV が生成されたり、PHP の CSV 関数を介してラウンドトリップ(往復変換)でデータが壊れる可能性があります。 `escape`のデフォルト値は`"\\"` なので、明示的に空の文字列を指定することを推奨します。デフォルト値は、PHP 9.0 以降の将来のバージョンで変更予定です。

> 注意:

> `enclosure` がフィールド内に含まれる場合は、同じ文字を二度続けることでエスケープします。 ただし、その直前に `escape` がある場合は別です。

警告

`escape` が空の文字列(`""`)以外に設定されているとき、 » RFC 4180 に準拠しない CSV が生成されたり、PHP の CSV 関数を介してラウンドトリップ(往復変換)でデータが壊れる可能性があります。 `escape`のデフォルト値は`"\\"` なので、明示的に空の文字列を指定することを推奨します。デフォルト値は、PHP 9.0 以降の将来のバージョンで変更予定です。

### 戻り値

書き出した文字列の長さを返します。失敗した場合に `false` を返します。

### エラー / 例外

`separator` または `enclosure` が 1 バイト長ではない場合、ValueError をスローします。

`escape` が 1 バイト長、または空文字列ではない場合、 ValueError をスローします。

### 変更履歴

バージョン | 説明
--- | ---
8.4.0 | `escape` のデフォルト値に依存することは、 非推奨になりました。
8.1.0 | オプションの引数 `eol` が追加されました。
7.4.0 | `escape` パラメータは空文字列を受け入れるようになりました。 この場合、(RFC 4180 に準拠していない) 独自仕様のエスケープ機構が無効になります。

### 例

例1 SplFileObject::fputcsv() の例

    <?php

    $list = array (
        array('aaa', 'bbb', 'ccc', 'dddd'),
        array('123', '456', '789'),
        array('"aaa"', '"bbb"')
    );

    $file = new SplFileObject('file.csv', 'w');

    foreach ($list as $fields) {
        $file->fputcsv($fields);
    }

    ?>

上の例は、次の内容をファイル `file.csv` に書き出します。

    aaa,bbb,ccc,dddd
    123,456,789
    """aaa""","""bbb"""

### 参考

- SplFileObject::fgetcsv() - ファイルから行を取り出し CSV フィールドとして処理する
- SplFileObject::setCsvControl() - CSV の区切り文字、囲み文字、エスケープ文字をセットする
- SplFileObject::getCsvControl() - CSV の区切り、囲み文字、エスケープ文字を取得する
- fputcsv() - 行を CSV 形式にフォーマットし、ファイルポインタに書き込む
- fgetcsv() - ファイルポインタから行を取得し、CSVフィールドを処理する
- str_getcsv() - CSV 文字列をパースして配列に格納する

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open