【PHP8.x】fputcsv関数の使い方
fputcsv関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
fputcsv関数は、CSV形式でフォーマットされた行をファイルポインタに書き込む関数です。この関数を使用することで、配列のデータをCSVファイルとして簡単に保存できます。ファイルポインタは、fopen関数などで事前に開いておく必要があります。
fputcsv関数は、必須の引数としてファイルポインタと、書き込むデータを含む配列を受け取ります。オプションの引数として、フィールドを囲む文字(通常はダブルクォーテーション)、フィールドを区切る文字(通常はカンマ)、および行末文字を指定できます。これらのオプション引数を省略した場合、デフォルト値が使用されます。
fputcsv関数は、書き込みに成功した場合は書き込んだ文字列の長さを返し、エラーが発生した場合はfalseを返します。エラーが発生した場合は、ファイルポインタが有効であること、および書き込み権限があることを確認してください。
fputcsv関数は、CSVファイルを生成する際に非常に便利です。例えば、データベースから取得したデータをCSV形式でエクスポートしたり、アプリケーションのログデータをCSV形式で保存したりする際に利用できます。この関数を使用することで、CSVファイルのフォーマットを自分で実装する必要がなくなり、開発効率が向上します。
構文(syntax)
1fputcsv(resource $stream, array $fields, string $separator = ",", string $enclosure = "\"", string $escape = "\\", string $eol = "\n"): int|false
引数(parameters)
resource $stream, array $fields, string $separator = ",", string $enclosure = """, string $escape = "\", string $eol = "\n"
- resource $stream: 書き込み先のストリームリソースを指定します
- array $fields: CSVとして書き込むフィールドの配列を指定します
- string $separator = ",": フィールドの区切り文字を指定します。デフォルトはカンマです
- string $enclosure = """: フィールドを囲む文字を指定します。デフォルトはダブルクォーテーションです
- string $escape = "\": エスケープ文字を指定します。デフォルトはバックスラッシュです
- string $eol = "\n": 改行コードを指定します。デフォルトは改行文字です
戻り値(return)
int|false
fputcsv 関数は、CSV フォーマットでファイルにデータを書き込むために使用されます。成功した場合は書き込んだバイト数を、失敗した場合は false を返します。
サンプルコード
PHP fputcsvでCSVを生成し出力する
1<?php 2 3/** 4 * fputcsv関数を使用してCSVファイルを生成し、その内容を出力するサンプルコードです。 5 * ダブルクォーテーションやカンマを含む文字列がどのようにCSV形式に変換されるかを示します。 6 */ 7function createAndDisplayCsv(): void 8{ 9 // CSVデータを一時的にメモリに書き込むためのファイルリソースを開きます。 10 // 'w+'モードは読み書き両用で、ファイルポインタを先頭に設定します。 11 $handle = fopen('php://memory', 'w+'); 12 13 if ($handle === false) { 14 echo "エラー: ファイルリソースのオープンに失敗しました。\n"; 15 return; 16 } 17 18 // CSVのヘッダー行として使用する配列を定義します。 19 $header = ['ID', '商品名', '詳細説明']; 20 21 // CSVに書き込むデータ行の配列を定義します。 22 // 2番目のデータにはカンマとダブルクォーテーションが含まれており、 23 // fputcsvがこれらを自動的に処理(エンクロージャで囲み、内部のエンクロージャをエスケープ)することを示します。 24 $data = [ 25 [1, 'りんご', '新鮮な青森県産。甘くて美味しい!'], 26 [2, 'オレンジ', '輸入柑橘類。酸味と甘みのバランスが良い、「最高品質」です。'], 27 [3, 'バナナ', '高地栽培品。朝食やおやつに最適。'], 28 ]; 29 30 // ヘッダー行をCSVに書き込みます。 31 // fputcsvはデフォルトで、フィールド内にカンマやダブルクォーテーションがある場合、 32 // そのフィールドをダブルクォーテーションで囲み(エンクロージャ)、 33 // 内部のダブルクォーテーションを二重化してエスケープします。 34 if (fputcsv($handle, $header) === false) { 35 echo "エラー: ヘッダーの書き込みに失敗しました。\n"; 36 fclose($handle); 37 return; 38 } 39 40 // データ行を一つずつCSVに書き込みます。 41 foreach ($data as $row) { 42 if (fputcsv($handle, $row) === false) { 43 echo "エラー: データ行の書き込みに失敗しました。\n"; 44 fclose($handle); 45 return; 46 } 47 } 48 49 // ファイルポインタを先頭に戻し、メモリに書き込まれたCSV内容全体を読み込みます。 50 rewind($handle); 51 $csvContent = stream_get_contents($handle); 52 53 // ファイルリソースを閉じ、メモリを解放します。 54 fclose($handle); 55 56 // 生成されたCSV内容を出力します。 57 echo "--- 生成されたCSV内容 ---\n"; 58 echo $csvContent; 59 echo "-------------------------\n"; 60} 61 62// 関数を実行してCSV生成処理を開始します。 63createAndDisplayCsv(); 64 65?>
fputcsv関数は、指定されたファイルリソースに配列のデータをCSV(Comma Separated Values)形式で書き込むPHPの関数です。主にCSVファイルを生成する際に利用されます。
第一引数 $stream には、データを書き込む対象のファイルリソースを指定します。第二引数 $fields には、CSVの一行として書き込むデータが格納された配列を渡します。デフォルトでは、各フィールドはカンマ (,) で区切られ、フィールド内にカンマやダブルクォーテーション (") が含まれる場合は、そのフィールド全体がダブルクォーテーションで囲まれます。また、フィールド内のダブルクォーテーションは二重化 ("") されてエスケープ処理されます。これはCSVの標準的なルールに則った挙動です。 $separator, $enclosure, $escape, $eol といった引数で、これらの区切り文字や囲み文字、エスケープ文字、行末文字をカスタマイズすることも可能です。
戻り値は、書き込んだバイト数を整数 (int) で返しますが、書き込みに失敗した場合は false を返します。
サンプルコードでは、php://memory という特殊なファイルリソースを使用して、一時的にメモリ上にCSVデータを生成しています。createAndDisplayCsv 関数内で、ヘッダーとデータ行を定義し、それぞれ fputcsv 関数で書き込んでいます。特に、商品名「輸入柑橘類。酸味と甘みのバランスが良い、「最高品質」です。」のように、カンマやダブルクォーテーションを含む文字列が指定された場合でも、fputcsv関数が自動的にそのフィールドをダブルクォーテーションで囲み、内部のダブルクォーテーションを二重化して正しくCSV形式に変換していることが確認できます。これにより、CSVファイルを読み込む際にデータが正しく解析されるようになります。最終的に、メモリに書き込まれたCSV内容を読み出して画面に出力しています。
fputcsv関数は配列の各要素をCSV形式でファイルリソースに書き込みます。この関数は、データ内にカンマやダブルクォーテーションといった特殊文字が含まれる場合、自動的にそのフィールドをダブルクォーテーションで囲み、内部のダブルクォーテーションを二重化してエスケープします。これにより、CSVファイルの構造が正しく保たれ、手動でのエスケープ処理は不要です。必ずfopenでファイルリソースを開き、fputcsvの戻り値をチェックしてエラーハンドリングを行い、処理後はfcloseでリソースを閉じるようにしてください。実際のファイルに書き出す際は、書き込み先のパーミッションに注意が必要です。
PHP fputcsvでCSV改行コードを扱う
1<?php 2 3/** 4 * fputcsv関数を使用してCSVデータを一時ファイルに書き込み、その内容を表示します。 5 * この関数は、CSVファイルへの行データの書き込み方法と、改行の挙動を実演します。 6 */ 7function writeCsvAndDisplayContent(): void 8{ 9 // 一時ファイル(メモリ内)を読み書きモードで開きます。 10 // 'r+' はファイルを読み書き可能で開き、ファイルポインタをファイルの先頭に置きます。 11 $stream = fopen('php://temp', 'r+'); 12 13 if ($stream === false) { 14 echo "エラー: ファイルストリームを開けませんでした。\n"; 15 return; 16 } 17 18 // CSVに書き込むデータを用意します。 19 $header = ['ID', '名前', '部署', '備考']; 20 $dataRows = [ 21 [101, '佐藤 健', '開発部', '新規プロジェクト担当'], 22 [102, '鈴木 花子', '営業部', '東日本エリア担当, 優良顧客'], // カンマを含むデータ 23 [103, '高橋 雄一', '人事部', '採用担当'], 24 ]; 25 26 // ヘッダー行をCSVに書き込みます。 27 // fputcsv関数は、引数で指定された各フィールドをデフォルトの区切り文字(カンマ)で区切り、 28 // 行末にデフォルトの改行文字("\n"、すなわちLF)を自動的に追加します。 29 // Windows環境でCRLF ("\r\n") を使用したい場合は、fputcsv($stream, $header, ',', '"', '\\', "\r\n"); のように 30 // 第6引数 (eol) で明示的に指定できます。 31 if (fputcsv($stream, $header) === false) { 32 echo "エラー: ヘッダーの書き込みに失敗しました。\n"; 33 fclose($stream); 34 return; 35 } 36 37 // データ行を一つずつCSVに書き込みます。 38 foreach ($dataRows as $row) { 39 if (fputcsv($stream, $row) === false) { 40 echo "エラー: データ行の書き込みに失敗しました。\n"; 41 fclose($stream); 42 return; 43 } 44 } 45 46 // ファイルポインタをストリームの先頭に戻します。 47 // これにより、書き込んだ内容を最初から読み出す準備ができます。 48 rewind($stream); 49 50 echo "--- 書き込まれたCSV内容 ---\n"; 51 // ストリームの全内容を読み出し、出力します。 52 // fputcsvによって追加された改行もここで確認できます。 53 echo stream_get_contents($stream); 54 echo "--- CSV内容の終わり ---\n"; 55 56 // 使用したファイルストリームを閉じます。 57 fclose($stream); 58} 59 60// 関数を実行します。 61writeCsvAndDisplayContent();
fputcsv関数は、PHPで配列のデータをCSV(Comma Separated Values)形式のファイルへ書き込むために使用されます。この関数は、データベースの内容や計算結果などを表形式で出力する際に大変役立ちます。
第一引数 $stream には、データを書き込む先のファイルリソースを指定します。これは、fopen関数などを使って開かれたファイルオブジェクトです。第二引数 $fields には、CSVの一行として書き込みたい各データ項目を要素とする配列を渡します。
fputcsvは、デフォルトでカンマ , を区切り文字、ダブルクォート " を囲み文字として使用し、配列の各要素をこれらのルールに基づいて整形して書き込みます。特に重要な挙動として、各行の書き込みが完了すると、自動的にデフォルトの改行コードであるLF (\n) を行末に追加します。これにより、複数の行を書き込んだ際に、各データ行が正しく新しい行として配置されます。もしWindows環境などでCRLF (\r\n) を使用したい場合は、第六引数 $eol で明示的に改行コードを指定することが可能です。
関数が成功すると、書き込まれたバイト数が整数値として返されます。書き込みに失敗した場合は false が返されます。
提供されたサンプルコードでは、一時ファイルを読み書きモードで開き、fputcsvを使ってヘッダー行と複数のデータ行を書き込んでいます。データ行にはカンマを含む文字列もあり、fputcsvが適切に囲み文字を適用してCSV形式を保っていることがわかります。書き込み後、rewind関数でファイルポインタを先頭に戻し、stream_get_contentsでファイルの内容全体を読み出すことで、fputcsvによって自動的に追加された改行を含んだCSVデータを確認しています。これにより、CSVファイルが意図通りに作成されているか検証することができます。
fputcsv関数は、CSV行の末尾にデフォルトで改行コード(\n)を自動的に追加します。そのため、行ごとに手動で改行を追加する必要はありません。Windows環境でCRLF(\r\n)を使用したい場合は、第6引数eolで明示的に指定することが可能です。書き込みに失敗するとfalseを返すため、必ず戻り値をチェックしエラー処理を行うことが重要です。データにカンマなどの区切り文字が含まれても関数が適切にエスケープ処理を行うため、手動でエスケープする必要はありません。日本語などを扱う際は、ファイルストリームの文字エンコーディングを意識し、必要に応じてmb_convert_encodingなどで文字列を変換してください。サンプルコードのphp://tempはメモリ内の一時ファイルであり、スクリプト終了時に自動で削除されます。