PHP の勉強「複数の外部 CSV ファイルを連想配列に」

November 17, 2010
php_img.gif

今回は、CSV ファイルを読み込んで、連想配列にする勉強をしてみました。配列にすることによって、各データの値が参照できるようになるので重宝するはず。

なにぶん、PHP の勉強を始めたばかりなので、ソースにムダがあると思いますが、大目に見てね。こうしてコードをさらすことで、上達すると思うので。多分。

外部の CSV ファイル

サンプル用に2つの簡単な CSV ファイルを用意しました。

基本的に、 CSV はエクセルから書き出されることが多いので、文字コードを「 Shift-JIS 」、ダブルクオーテーションなしの「,(カンマ)」区切りにしています(一行目は項目名)。

text1.csv

ID,ソフト名
01,Illustrator
02,Photoshop 
03,InDesign
04,Flash
05,Dreamweaver
06,After Effects

text2.csv

ID,説明
01,お絵かきソフト
02,レタッチソフト
03,編集ソフト
04,アニメーションソフト
05,コーディングソフト
06,動画ソフト

PHP コード

<?php
//外部ファイルを配列に
$csvFiles = array("text1.csv","text2.csv");
//読み込んだファイルの配列に対して繰り返し処理
foreach($csvFiles as $key){
	//読み込んだファイルの各行のデータを文字列に格納して返す
	$str = @file_get_contents($key);
	//SJISからUTF-8に変換
	$str = $str = mb_convert_encoding($str, "UTF-8", "SJIS");
	//ファイルの改行を<br />に置換(置換する文字は何でもよい)
	$array = str_replace("\r\n", '<br />', $str);
	//<br />を区切り文字として分割
	$array = explode('<br />', $array);
		
	foreach($array as $koumoku => $value){
		if($value){
			if($koumoku == 0){ //項目名(一行目)は$headerに格納
				$header = explode(',', $value) ;
			}else{
				$item = explode(',', $value) ; //その他は$itemに格納
				//「CSV名」、「ID」($item[0])をキーに連想配列作成
				$assoArray[$key][$item[0]] = array_combine($header, $item);
			}
		}
	}
}
print_r($assoArray); //出力確認
?> 

出力結果はコチラ

【 MEMO 】

  • CSV を読み込む時は、「fgetcsv」という関数があるようですが、PHP5 から Shift-JIS エンコードの場合、文字列が「"..."」(ダブルクオーテーション)で囲まれていないと、読み込めない文字もあるらしいので、「 file_get_contents 」関数でファイルの中身を丸ごと変数に格納。
  • 変数 $str に入れたファイルを「 mb_convert_encoding 」関数で Shift-JIS から UTF-8 文字コードに変換。
  • 「 str_replace 」関数で、CSV ファイルの改行を置換し、「 explode 」関数で分割して配列に格納。
  • CSV の一行目(項目名)と項目をそれぞれ「 $header 」と「 $item 」の配列に格納。
  • 「 array_combine 」関数で、CSV 名と項目名の連想配列を作成。

参考サイト

PHPスクリプト講座:array()による配列生成 -- そふぃのphp入門

PHP5でfgetcsvが正常に動作しない : ::yossy.blog::

PHP: array_combine - Manual

STAFF_01 [KYS-LAB]: ページが見つかりません。