【PHP8.x】str_getcsv()関数の使い方
str_getcsv関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
str_getcsv関数は、CSV(Comma Separated Values)形式の文字列を解析し、その内容を配列として取得する関数です。この関数は、外部からCSV形式で提供されたデータを、PHPプログラム内で扱いやすい形式に変換する際に非常に役立ちます。
具体的には、一つのCSV行に相当する文字列を入力として受け取り、その中の各フィールドを配列の要素として返します。デフォルトでは、カンマ「,」を各フィールドの区切り文字として、ダブルクォート「"」をフィールドを囲む文字として認識し処理します。しかし、CSV形式は用途によって区切り文字や囲み文字が異なる場合があるため、この関数はオプションとしてそれらの文字を指定できる柔軟性も持っています。例えば、セミコロンで区切られたCSVや、シングルクォートで囲まれたフィールドを持つCSVなどにも対応可能です。
関数が正常に処理を完了すると、解析された各フィールドの値を要素とする文字列の配列が返されます。これにより、CSVデータの内容に簡単にアクセスし、様々な処理を行うことができます。PHP 8以降では、期待される型ではない引数が渡された場合には TypeError が、不正なCSV形式の文字列や引数によって解析に失敗した場合には ValueError がスローされるため、堅牢なアプリケーションを構築するためにはこれらの例外を適切に処理することが推奨されます。
str_getcsv関数は、CSVデータのインポートやエクスポート機能を実装する上で、非常に基本的かつ重要な機能を提供します。
構文(syntax)
1<?php 2$csvString = "apple,banana,orange"; 3$array = str_getcsv($csvString); 4print_r($array); 5?>
引数(parameters)
string $string, string $separator = ',', string $enclosure = '"', string $escape = '\'
- string $string: 処理対象のCSV形式の文字列
- string $separator = ',': 区切り文字を指定する文字(デフォルトはカンマ)
- string $enclosure = '"': 文字列を囲む文字を指定する文字(デフォルトはダブルクォーテーション)
- string $escape = '\': エスケープ文字を指定する文字(デフォルトはバックスラッシュ)
戻り値(return)
array
指定されたCSV文字列をパースし、各フィールドを要素とする配列を返します。
サンプルコード
PHPでCSV文字列を配列に変換する
1<?php 2 3/** 4 * 複数行のCSV文字列を解析し、行と列を表すネストされた配列に変換します。 5 * array_map関数とstr_getcsv関数を組み合わせて、各CSV行を処理します。 6 * 7 * @param string $csvString 解析するCSVデータを含む文字列。各行は改行文字で区切られている必要があります。 8 * @param string $separator フィールドを区切る文字(デフォルトはカンマ ', ')。 9 * @param string $enclosure フィールド値を囲む文字(デフォルトはダブルクォート '"')。 10 * @param string $escape 特殊文字をエスケープするために使用される文字(デフォルトはバックスラッシュ '\')。 11 * @return array CSVデータを行ごとにパースしたネストされた配列。各内部配列は1つのCSV行を表します。 12 */ 13function parseCsvStringToArray( 14 string $csvString, 15 string $separator = ',', 16 string $enclosure = '"', 17 string $escape = '\\' 18): array { 19 // 1. 入力されたCSV文字列を改行文字 (\n) で分割し、各行を配列の要素とします。 20 // explode関数は、指定された区切り文字で文字列を分割し、その結果を配列として返します。 21 $lines = explode("\n", $csvString); 22 23 // 2. array_map関数を使用して、分割された各行にstr_getcsv関数を適用します。 24 // array_mapは、配列 ($lines) の各要素に対して指定されたコールバック関数を実行し、 25 // その結果を新しい配列として返します。 26 // str_getcsvは、1つのCSV文字列(行)を解析し、フィールドの配列として返します。 27 // ここでは、匿名関数 (クロージャ) を使用して、str_getcsvに追加の引数(区切り文字など)を渡しています。 28 $parsedData = array_map(function (string $line) use ($separator, $enclosure, $escape): array { 29 return str_getcsv($line, $separator, $enclosure, $escape); 30 }, $lines); 31 32 // 必要に応じて、空の行(str_getcsvが['']を返す場合など)を結果から除外する処理をここに追加できます。 33 // 例: return array_filter($parsedData, fn($row) => !empty(array_filter($row))); 34 35 return $parsedData; 36} 37 38// --- サンプルコードの実行 --- 39 40// 解析するCSVデータをヒアドキュメント形式で定義します。 41// ヒアドキュメントは、複数行の文字列をPHPコード内で記述する際に便利です。 42$csvData = <<<CSV 43"Name","Age","City" 44"Alice",30,"New York" 45"Bob",24,"London" 46"Charlie",35,"Paris, France" 47"David",28,"Tokyo" 48CSV; 49 50echo "--- 元のCSVデータ ---\n"; 51echo $csvData . "\n\n"; 52 53// parseCsvStringToArray関数を呼び出し、CSV文字列を配列に変換します。 54$parsedArray = parseCsvStringToArray($csvData); 55 56echo "--- 解析された配列データ ---\n"; 57// print_r関数は、配列の内容を人間が読みやすい形式で表示するために使用されます。 58print_r($parsedArray); 59 60echo "\n--- 特定のデータへのアクセス例 ---\n"; 61// 解析された配列から特定のデータにアクセスする方法の例です。 62// 配列は0から始まるインデックスを持ちます。 63echo "ヘッダー行: " . implode(', ', $parsedArray[0]) . "\n"; // 最初の行(インデックス0)はヘッダー 64echo "2番目のユーザーの名前: " . $parsedArray[2][0] . "\n"; // 3行目(インデックス2)の最初の要素(インデックス0) 65echo "Aliceの年齢: " . $parsedArray[1][1] . "\n"; // 2行目(インデックス1)の2番目の要素(インデックス1) 66 67?>
このPHPコードは、複数行のCSV(Comma Separated Values)形式の文字列を、行と列を表すネストされた配列に変換するparseCsvStringToArray関数を提供します。CSVデータは通常、カンマなどで区切られた値が並び、改行で次の行に移る形式です。
関数parseCsvStringToArrayは、第一引数$csvStringで与えられたCSV文字列を処理します。まず、explode関数を用いて、CSV文字列を改行コード(\n)で分割し、各行を配列の要素として取得します。次に、array_map関数を利用して、分割された各行の文字列に対してstr_getcsv関数を適用します。array_mapは、配列の各要素に関数を適用し、その結果を新しい配列として返す便利な関数です。
ここで核となるstr_getcsv関数は、与えられた1行のCSV文字列を解析し、各フィールドを要素とする配列を返します。この関数は、カンマ以外の区切り文字($separator)、ダブルクォートなどの囲み文字($enclosure)、エスケープ文字($escape)を引数で指定できるため、多様なCSVフォーマットに対応可能です。最終的に、parseCsvStringToArray関数は、各行がさらに配列として格納されたネストされた配列を戻り値として返します。これにより、CSVデータが行と列の構造を持つ多次元配列として扱えるようになります。サンプルコードの実行部分では、print_rで解析結果を表示し、特定の行や列のデータにアクセスする方法を示しています。
このサンプルコードは、CSV文字列を複数行にわたって解析し、ネストされた配列に変換する効率的な方法を示しています。
注意点として、改行コードはシステムやファイルによって\nの他に\r\nなども存在するため、explode("\n", ...)だけでは全てのCSV形式に完全に対応できない場合があります。より堅牢な分割には正規表現を使った方法も検討すると良いでしょう。また、入力されたCSV文字列に空の行や末尾の余分な改行が含まれる場合、パース結果に空の配列要素が生成されることがあります。これを防ぐためには、array_filter関数などで空の行を除外する処理を追加すると、データがより扱いやすくなります。
この方法はCSVデータ全体を一度メモリに読み込んで処理するため、数ギガバイトにもなるような非常に大きなCSVファイルを扱う際には、メモリ使用量に注意が必要です。そのような大規模なデータ処理には、ファイルを少しずつ読み込みながら処理するfgetcsv関数を利用する方が効率的です。
匿名関数内でuseキーワードを使用しているのは、外部スコープで定義された$separatorなどの変数を、その匿名関数内で利用可能にするためです。この構文はPHPでよく使われるイディオムですので、理解しておきましょう。パースされた結果はネストされた配列になりますが、配列のインデックスは0から始まるため、データにアクセスする際は、ヘッダー行の有無などを考慮し、正しいインデックスを指定する必要があります。
PHP str_getcsvで区切り文字を指定する
1<?php 2 3/** 4 * str_getcsv() を使って、デフォルトのカンマ(,)以外の区切り文字(delimiter)を 5 * 指定してCSV文字列を配列に変換するサンプル関数 6 * 7 * @return void 8 */ 9function parseCsvWithCustomDelimiter(): void 10{ 11 // セミコロン(;)を区切り文字(delimiter)として使用するCSV形式の文字列 12 $csvString = '101;Taro Yamada;Tokyo'; 13 14 // str_getcsv() の第2引数に、区切り文字としてセミコロン ';' を指定します。 15 // この引数を指定しない場合、デフォルトでカンマ ',' が使われます。 16 $data = str_getcsv($csvString, ';'); 17 18 // パース結果の配列を出力します 19 print_r($data); 20} 21 22// 関数を実行 23parseCsvWithCustomDelimiter(); 24 25/* 26実行結果: 27 28Array 29( 30 [0] => 101 31 [1] => Taro Yamada 32 [2] => Tokyo 33) 34 35*/
str_getcsv関数は、CSV(Comma-Separated Values)形式の文字列を解析し、各フィールドを要素とする配列に変換するためのPHP関数です。
このサンプルコードでは、str_getcsv関数を使って、デフォルトの区切り文字であるカンマ(,)以外の文字で区切られたCSV文字列を処理する方法を示しています。変数 $csvString には、一般的なカンマではなくセミコロン(;)を区切り文字(デリミタ)として使用した文字列 '101;Taro Yamada;Tokyo' が格納されています。
str_getcsv関数を呼び出す際、第1引数には解析対象の文字列 $csvString を渡します。そして、重要なのが第2引数 $separator です。ここに区切り文字としてセミコロン(;)を指定することで、関数はセミコロンを基準に文字列を分割します。もしこの第2引数を省略すると、デフォルトのカンマ(,)が区切り文字として扱われます。
この関数の戻り値は、解析結果が格納された配列です。実行結果を見ると、元の文字列がセミコロンで正しく分割され、'101'、'Taro Yamada'、'Tokyo' の3つの要素を持つ配列が生成されていることが確認できます。
str_getcsv関数は、CSV形式の文字列を配列に変換する際に便利です。注意点として、この関数はデフォルトでカンマを区切り文字として認識します。サンプルコードのようにセミコロンなど他の文字を区切り文字として使用する場合は、必ず第2引数でその文字を指定する必要があります。また、実際のCSVデータでは、値自体に区切り文字が含まれるケースも考えられます。その場合、値は「囲み文字」(デフォルトはダブルクォート)で囲まれていることが一般的です。この囲み文字やエスケープ文字も、第3、第4引数で指定できることを覚えておくと、より複雑なCSVデータにも対応できます。この関数は文字列を処理するため、ファイルから直接CSVを読み込む場合はfgetcsv関数の利用がより適しています。
PHP str_getcsvで改行含むCSVをパースする
1<?php 2 3declare(strict_types=1); 4 5/** 6 * str_getcsv 関数を使用して、CSVフィールド内に改行文字を含む文字列をパースするサンプル。 7 * 8 * str_getcsv は、ダブルクォートなどのエンクロージャーで囲まれたフィールド内の 9 * 改行文字を正しくデータの一部として扱います。 10 */ 11function demonstrateStrGetCsvWithLineBreaks(): void 12{ 13 // CSVフィールド内に改行文字 (\n) が含まれる文字列を定義します。 14 // この改行文字はダブルクォートで囲まれたフィールド内にあるため、 15 // str_getcsvによってデータの一部として認識されます。 16 $csvString = '"ID","商品名","複数行の説明文","価格"' . PHP_EOL . 17 '1,"PHP入門","PHP言語の基礎から' . "\n" . 18 '応用までを学べる\n書籍です。",1500'; 19 20 // str_getcsv は一度に1行のCSV文字列しか処理できません。 21 // したがって、入力文字列をまず改行で分割する必要があります。 22 $lines = explode(PHP_EOL, $csvString); 23 24 echo "--- 入力CSV文字列 ---" . PHP_EOL; 25 echo $csvString . PHP_EOL . PHP_EOL; 26 27 echo "--- パース結果 ---" . PHP_EOL; 28 foreach ($lines as $index => $line) { 29 if (trim($line) === '') { 30 continue; // 空行はスキップ 31 } 32 echo "行 " . ($index + 1) . ": "; 33 // str_getcsv を使用して各行のCSV文字列を配列にパースします。 34 // デフォルトのセパレータ (,)、エンクロージャー (")、エスケープ文字 (\) が使用されます。 35 $parsedArray = str_getcsv($line); 36 37 print_r($parsedArray); 38 39 // 複数行の説明文フィールド(インデックス2)の内容を確認します。 40 // 改行文字が正しく保持されていることがわかります。 41 if (isset($parsedArray[2])) { 42 echo " 詳細: 3番目のフィールド(インデックス2):" . PHP_EOL; 43 echo " " . str_replace("\n", "\n ", $parsedArray[2]) . PHP_EOL; 44 } 45 } 46} 47 48// 関数を実行して、サンプルコードの動作を確認します。 49demonstrateStrGetCsvWithLineBreaks();
PHP 8 の str_getcsv 関数は、CSV (Comma Separated Values) 形式の文字列を配列に変換する際に使用します。この関数は、プログラムでCSVデータを扱いやすくするために非常に役立ちます。
特に、CSVフィールド内に改行文字が含まれている場合でも、ダブルクォートなどのエンクロージャー(囲み文字)でフィールドが囲まれていれば、str_getcsvは改行文字を正しくデータの一部として認識し、そのまま保持します。これにより、複数行にわたる商品説明文なども正確にパースできます。
ただし、str_getcsvは一度に1行のCSV文字列しか処理できません。そのため、複数行からなるCSVデータ全体を処理する際には、まず入力された文字列を改行コード(PHP_EOLなど)で各行に分割し、その後、分割された各行に対してstr_getcsv関数を適用する必要があります。
引数には、解析したいCSV形式の $string を指定します。また、区切り文字 ($separator) や囲み文字 ($enclosure)、エスケープ文字 ($escape) を任意で指定できますが、多くの場合、デフォルト値で問題なく動作します。戻り値は、解析された各フィールドが要素として格納された配列 array となります。
str_getcsv関数はCSVの1行をパースするものです。そのため、複数のCSV行を含む文字列を一度に処理する際は、事前に改行で各行に分割してから、この関数を適用する必要がある点に特にご注意ください。サンプルコードのように、ダブルクォートなどのエンクロージャーで囲まれたフィールド内に含まれる改行文字は、正しくデータの一部として認識され、保持されます。また、区切り文字や囲み文字の引数にはデフォルト値がありますが、もし対象のCSV形式が異なる場合は、意図した通りにパースされるよう、これらの引数を明示的に指定することが大切です。declare(strict_types=1);を使用することで、型に関する厳密なチェックが有効になり、より安全で堅牢なコード作成に役立ちます。
PHP str_getcsvでUTF-8 CSVを配列に変換する
1<?php 2 3/** 4 * str_getcsv関数の基本的な使い方を示すサンプルコード。 5 * UTF-8文字列を含むCSV形式の行を配列に変換します。 6 * システムエンジニアを目指す初心者の方にも理解しやすいよう、 7 * デフォルトの引数とカスタムの引数を使った例を示します。 8 */ 9function demonstrateStrGetCsvUsage(): void 10{ 11 // 1. UTF-8文字を含む標準的なCSV文字列の例 12 // 商品名に日本語、備考欄にUTF-8文字を含んでいます。 13 $csvString1 = '"商品名 (日本語)","価格",250,"備考 (UTF-8の例)"'; 14 echo "--- 例 1: デフォルトの区切り文字と囲み文字 ---\n"; 15 echo "元のCSV文字列: " . $csvString1 . "\n\n"; 16 17 // str_getcsv関数を使って、CSV文字列を配列に変換します。 18 // デフォルトでは、カンマ (',') を区切り文字、ダブルクォート ('"') を囲み文字として認識します。 19 // UTF-8文字は正しく処理されます。 20 $dataArray1 = str_getcsv($csvString1); 21 22 echo "str_getcsv() の結果 (デフォルト引数):\n"; 23 print_r($dataArray1); 24 echo "\n"; 25 26 // 2. 異なる区切り文字と囲み文字を使用するCSV文字列の例 27 // セミコロン (';') で区切られ、シングルクォート ("'") で囲まれたデータです。 28 $csvString2 = "'Item ID';'商品名 (PHP8)';'数量';'解説 (UTF-8)'"; 29 echo "--- 例 2: カスタムの区切り文字と囲み文字 ---\n"; 30 echo "元のCSV文字列: " . $csvString2 . "\n\n"; 31 32 // str_getcsv関数に、カスタムの区切り文字と囲み文字を指定します。 33 // 第2引数で区切り文字 (separator) を、第3引数で囲み文字 (enclosure) を設定します。 34 $dataArray2 = str_getcsv($csvString2, ';', "'"); 35 36 echo "str_getcsv() の結果 (セミコロン区切り、シングルクォート囲み):\n"; 37 print_r($dataArray2); 38 echo "\n"; 39} 40 41// 上記の関数を実行し、結果を表示します。 42demonstrateStrGetCsvUsage(); 43
このPHPコードは、CSV形式の文字列を解析して配列に変換するstr_getcsv関数の使い方を説明するものです。この関数は、文字列をCSVの1行として扱い、各フィールドを要素とする配列を返します。日本語のようなUTF-8文字も正しく処理できます。
最初の例では、str_getcsv関数を最も基本的な形で使用しています。第1引数にCSV文字列を渡すだけで、デフォルトの区切り文字であるカンマ(,)と、囲み文字であるダブルクォート(")を自動的に認識し、文字列を配列に分割します。
2つ目の例では、より柔軟な使い方を示しています。第2引数に区切り文字としてセミコロン(;)を、第3引数に囲み文字としてシングルクォート(')を明示的に指定しています。これにより、一般的なカンマ区切り以外のデータ形式にも対応できることがわかります。
このようにstr_getcsv関数は、引数を調整することで様々な形式のCSVデータを簡単に扱うことができるため、システム開発において非常に便利な関数です。
str_getcsv関数はCSV形式の文字列「1行分」を配列に変換する関数です。ファイル全体ではなく、1行ずつ処理する点に注意してください。UTF-8などの日本語文字を正しく扱うには、入力する文字列自体のエンコーディングがUTF-8であることが前提となります。特にファイルから読み込んだ文字列を処理する場合は、ファイルの文字コードを事前に確認することが重要です。また、CSVデータの形式は様々であるため、サンプルコードの例2のように、データの仕様に合わせて区切り文字や囲み文字を引数で正しく指定しないと、意図通りに配列へ変換されません。