teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

ストリームフィルタ

2015/07/22 10:45

投稿

ngyuki
ngyuki

スコア4516

answer CHANGED
@@ -85,3 +85,24 @@
85
85
  )
86
86
  */
87
87
  ```
88
+
89
+ ---
90
+
91
+ そもそも、今の御時世なら tmpfile なんて使うよりもストリームフィルタで良いと思われます。
92
+
93
+ ```lang-php
94
+ <?php
95
+ $file = '1-1.csv';
96
+ $fp = fopen($file, 'r');
97
+ $sh = stream_filter_prepend($fp, 'convert.iconv.cp932/utf-8', STREAM_FILTER_READ);
98
+ $csv = array();
99
+ $keys = null;
100
+ while ($data = fgetcsv($fp, 1000,",")) {
101
+ if ($keys === null) {
102
+ $keys = $data;
103
+ } else {
104
+ $csv[] = array_combine($keys, $data);
105
+ }
106
+ }
107
+ print_r($csv);
108
+ ```

2

追記

2015/07/22 10:45

投稿

ngyuki
ngyuki

スコア4516

answer CHANGED
@@ -41,3 +41,47 @@
41
41
  }, $ret);
42
42
  ```
43
43
 
44
+ ---
45
+
46
+ もしくは、次のように CSV からの読み込みのループの時点で連想配列にしてしまうこともできます。
47
+
48
+ ```lang-php
49
+ <?php
50
+ $file = '1-1.csv';
51
+ $data = file_get_contents($file);
52
+ $data = mb_convert_encoding($data, 'UTF-8','sjis-win');
53
+ $temp = tmpfile();
54
+ $csv = array();
55
+ fwrite($temp,$data);
56
+ rewind($temp);
57
+ $keys = null;
58
+ while ($data = fgetcsv($temp, 1000,",")) {
59
+ if ($keys === null) {
60
+ $keys = $data;
61
+ } else {
62
+ $csv[] = array_combine($keys, $data);
63
+ }
64
+ }
65
+ print_r($csv);
66
+ /*
67
+ Array
68
+ (
69
+ [0] => Array
70
+ (
71
+ [code] => A10
72
+ [name] => 太田店
73
+ [place] => 新宿
74
+ [] =>
75
+ )
76
+
77
+ [1] => Array
78
+ (
79
+ [code] => A11
80
+ [name] => 山田店
81
+ [place] => 五反田
82
+ [] =>
83
+ )
84
+
85
+ )
86
+ */
87
+ ```

1

空の除去

2015/07/22 10:40

投稿

ngyuki
ngyuki

スコア4516

answer CHANGED
@@ -30,4 +30,14 @@
30
30
 
31
31
  )
32
32
  */
33
- ```
33
+ ```
34
+
35
+ `[] =>` のような空の部分が邪魔なら、↑の結果をさらに次のようにすれば除去できます。
36
+
37
+ ```lang-php
38
+ $ret = array_map(function ($row) {
39
+ unset($row['']);
40
+ return $row;
41
+ }, $ret);
42
+ ```
43
+