今回はPHPで配列をCSVに変換して出力したり、CSVデータを読み込んで配列にする方法です。
ただ配列をカンマ区切りにするだけなら下の記事で紹介している implode() を使うほうが簡単です。implode() ならカンマだけでなく好きな区切り文字を指定することもできます。
≫ PHPの配列をカンマ区切りの文字列する方法とその逆の方法
PHPの配列をCSVデータとしてファイルに出力する方法
PHPの配列をCSVデータとしてファイルに出力するには fputcsv() を使います。
[aside type=”normal”]fputcsv ($出力先ファイル, $配列)[/aside]
$出力先ファイルはfopen()を使いファイルを操作するハンドラーを作成します。
$配列は、CSVに出力するデータです。1次元配列を指定し、1行出力します。
この方法は、配列をCSV形式のデータに変換してファイルに出力するところまでを1つの関数で実行してしまいます。
カンマ以外の区切り文字は指定できません。
実際にCSVを出力してみましょう。
$ary = array(
array('A', 23, '北海道,青森', '我輩は"猫"である。'),
array('A', 23, '沖縄', "我輩は'猫'である。"),
array('name' => 'A', 'age' => 23, 'from' => '東京,埼玉,千葉', "word" => 'ぼっちゃん'),
);
// 出力先のファイルを開く。'w'は書き込みモードでファイルを開く意味
$filew = fopen('test.csv', 'w');
foreach ($ary as $v) {
fputcsv($filew, $v);
}
// ファイルを閉じる
fclose($filew);
これを実行すると、test.csvに以下のようなCSVデータが出力されます。
A,23,"北海道,青森","我輩は""猫""である。" A,23,沖縄,我輩は'猫'である。 A,23,"東京,埼玉,千葉",ぼっちゃん
‘北海道,青森’ のように配列の1つの値にカンマが含まれている場合、ちゃんとダブルクォーテーションで囲んで出力してくれます。
implode()だとそこまでは対応してくれませんね。
このダブルクォーテーションが無いと 北海道,青森 がそれぞれ1つの値として認識されてしまい、CSVデータとして値が1つ増えたことになってしまいます。
‘我輩は”猫”である。’ は値にダブルクォーテーションが含まれているパターンですが、“我輩は””猫””である。” とちゃんとエスケープされている状態になります。
連想配列の場合はキーは無視されてしまうようですね。
CSVなので仕方ないですね。
次はCSVを読み込んでみましょう。
CSVを読み込み配列にする方法
CSVデータを読み込み配列にするには、fgetcsv() を使います。
[aside type=”normal”]$1行分の配列 = fgetcsv($CSVファイル)[/aside]
$CSVファイルは、fopen()を使いファイルを操作するハンドラーを作成します。モードは読み込みの’r’を指定します。
戻り値の$1行分の配列は、CSV1行分を配列に変換して返してくれます。
1行処理する度に内部のポインタが1行分ずれていき、連続で実行すると最終行までデータを読み込んでくれます。
この関数はfputcsv()の逆で、CSVデータを読み込んだら配列に変換するところまでやってくれます。
ちゃんとダブルクォーテーションやエスケープ文字も対応してくれます。
先ほど上で出力したCSVファイルを読み込んで配列にしてみます。
// CSVファイルを開く。モードは読み込みの'r'
$filer = fopen('test.csv', 'r');
$newAry = array();
// 1行ずつCSVを配列に変換して $newAry に格納。
while ($line = fgetcsv($filer)) {
$newAry[] = $line;
}
// ファイルを閉じる
fclose($filer);
// 作成した配列を出力
var_dump($newAry);
fgetcsv()でデータが取得できれば、$lineは配列になります。
この配列の中身があれば while文の中に進む流れですね。
そして$newAry[] = $line;で$newAryに取得した配列を全て格納します。
$newAryの中身を出力すると以下のようになります。
array(3) {
[0]=>
array(4) {
[0]=>
string(1) "A"
[1]=>
string(2) "23"
[2]=>
string(16) "北海道,青森"
[3]=>
string(26) "我輩は"猫"である。"
}
[1]=>
array(4) {
[0]=>
string(1) "A"
[1]=>
string(2) "23"
[2]=>
string(6) "沖縄"
[3]=>
string(26) "我輩は'猫'である。"
}
[2]=>
array(4) {
[0]=>
string(1) "A"
[1]=>
string(2) "23"
[2]=>
string(20) "東京,埼玉,千葉"
[3]=>
string(15) "ぼっちゃん"
}
}
ちゃんと値の中にカンマやダブルクォーテーションがある場合も、1つの配列の要素として処理できています。
連想配列でキーを持っていたものは無くなってしまいますが、CSVなので仕方ないです。
連想配列のキーも保持しておきたい場合はCSVではなくJSONなどを使うといいでしょう。
ちなみに、最初にCSVを出力するときに定義した配列を出力すると以下のようになります。
array(3) {
[0]=>
array(4) {
[0]=>
string(1) "A"
[1]=>
int(23)
[2]=>
string(16) "北海道,青森"
[3]=>
string(26) "我輩は"猫"である。"
}
[1]=>
array(4) {
[0]=>
string(1) "A"
[1]=>
int(23)
[2]=>
string(6) "沖縄"
[3]=>
string(26) "我輩は'猫'である。"
}
[2]=>
array(4) {
["name"]=>
string(1) "A"
["age"]=>
int(23)
["from"]=>
string(20) "東京,埼玉,千葉"
["word"]=>
string(15) "ぼっちゃん"
}
}
いったんCSVに変換して再度読み込みなおしたものと比較しても問題ないことが分かります。
まとめ
CSVファイルを扱うためには、まずファイルを開く fopen() を使う。読み込みと書き込みでモードが違うので注意。
配列をCSVに出力するにはfputcsv()を使う。
CSVを配列に出力するにはfgetcsv()を使う。
ファイルを操作し終わったらfclose()で開いたファイルを閉じることを忘れずに!!










コメント