🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

16904閲覧

【PHP】CSVファイルを読み込んで、多次元配列に格納したいです。

humburger

総合スコア31

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/07/22 10:21

編集2015/07/22 10:28

code,name,place,
A10,太田店,新宿,
A11,山田店,五反田,

上記のような、1-1.CSVファイルを読み込んで、
$csv=array(array("code"=>"A10","name"=>"太田店","place"=>"新宿"),
array("code"=>"A11","name"=>"山田店","place"=>"五反田")
);
上記のような配列に格納したいです。

$file = '1-1.csv';
$data = file_get_contents($file);
$data = mb_convert_encoding($data, 'UTF-8','sjis-win');
$temp = tmpfile();
$csv = array();
$h = 0;
fwrite($temp,$data);
rewind($temp);

while($data = fgetcsv($temp, 1000,",")){
for($i = 0; $i < count($data); $i++){
$csv[$h][$i] = $data[$i];
}
$h++;
}
でやってみたのですが、print_rで確認すると下記のようになってしまいました。
Array ( [0] => Array ( [0] => code, [1] => name, [2] => place, ) [1] => Array ( [0] => A10, [1] => 太田店, [2] => 新宿, ) [2] => Array ( [0] => A11, [1] => 山田店, [2] => 五反田, ) )

どのようにしたら、よいかご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

それでうまくできると思うことが逆に不思議なのですが・・・

そのコードでできた $csv を使って次のようにすると、目的のものに近い結果が得られます。

lang

1$keys = array_shift($csv); 2$ret = array_map(function ($row) use ($keys) { 3 return array_combine($keys, $row); 4}, $csv); 5 6print_r($ret); 7/* 8Array 9( 10 [0] => Array 11 ( 12 [code] => A10 13 [name] => 太田店 14 [place] => 新宿 15 [] => 16 ) 17 18 [1] => Array 19 ( 20 [code] => A11 21 [name] => 山田店 22 [place] => 五反田 23 [] => 24 ) 25 26) 27*/

[] => のような空の部分が邪魔なら、↑の結果をさらに次のようにすれば除去できます。

lang

1$ret = array_map(function ($row) { 2 unset($row['']); 3 return $row; 4}, $ret);

もしくは、次のように CSV からの読み込みのループの時点で連想配列にしてしまうこともできます。

lang

1<?php 2$file = '1-1.csv'; 3$data = file_get_contents($file); 4$data = mb_convert_encoding($data, 'UTF-8','sjis-win'); 5$temp = tmpfile(); 6$csv = array(); 7fwrite($temp,$data); 8rewind($temp); 9$keys = null; 10while ($data = fgetcsv($temp, 1000,",")) { 11 if ($keys === null) { 12 $keys = $data; 13 } else { 14 $csv[] = array_combine($keys, $data); 15 } 16} 17print_r($csv); 18/* 19Array 20( 21 [0] => Array 22 ( 23 [code] => A10 24 [name] => 太田店 25 [place] => 新宿 26 [] => 27 ) 28 29 [1] => Array 30 ( 31 [code] => A11 32 [name] => 山田店 33 [place] => 五反田 34 [] => 35 ) 36 37) 38*/

そもそも、今の御時世なら tmpfile なんて使うよりもストリームフィルタで良いと思われます。

lang

1<?php 2$file = '1-1.csv'; 3$fp = fopen($file, 'r'); 4$sh = stream_filter_prepend($fp, 'convert.iconv.cp932/utf-8', STREAM_FILTER_READ); 5$csv = array(); 6$keys = null; 7while ($data = fgetcsv($fp, 1000,",")) { 8 if ($keys === null) { 9 $keys = $data; 10 } else { 11 $csv[] = array_combine($keys, $data); 12 } 13} 14print_r($csv);

投稿2015/07/22 10:32

編集2015/07/22 10:45
ngyuki

総合スコア4516

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

humburger

2015/07/22 15:25

ご回答ありがとうございます。教えていただいたもので、できました!助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問