それでうまくできると思うことが逆に不思議なのですが・・・
そのコードでできた $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 15:25