回答編集履歴

4

`fputcsv\(\)` 起因や BOM 起因

2017/07/26 05:53

投稿

think49
think49

スコア18164

test CHANGED
@@ -114,7 +114,7 @@
114
114
 
115
115
 
116
116
 
117
- ならば、`fputcsv()` や BOM 起因疑う余地はありません。
117
+ ならば、`fputcsv()` 起因や BOM 起因疑う余地はありません。
118
118
 
119
119
 
120
120
 

3

\$valuess\[0\]\[0\]

2017/07/26 05:53

投稿

think49
think49

スコア18164

test CHANGED
@@ -136,7 +136,7 @@
136
136
 
137
137
 
138
138
 
139
- 疑うべきは変数 `$valuess` の値であり、1列目が空欄になっていると思われます。
139
+ 疑うべきは変数 `$valuess` の値であり、`$valuess[0][0]` が空欄になっていると思われます。
140
140
 
141
141
  `var_dump()` で値を確認して下さい。
142
142
 

2

2行目以降の1列目が空欄になる

2017/07/26 05:50

投稿

think49
think49

スコア18164

test CHANGED
@@ -84,4 +84,74 @@
84
84
 
85
85
 
86
86
 
87
+ ### 2行目以降の1列目が空欄になる
88
+
89
+
90
+
91
+ > 1行目の1列目以外のすべての1列目が空欄になります。
92
+
93
+ > 1行目の1列目に「項目名」が挿入され、それがずれていることはありません。
94
+
95
+
96
+
97
+ 上記の通り、現象を再確認しました。
98
+
99
+ CSVデータは下記のようになっていると思われます。
100
+
101
+
102
+
103
+ ```
104
+
105
+ "項目A","項目B"
106
+
107
+ ,"Cell-1A","Cell-1B"
108
+
109
+ ,"Cell-2A","Cell-2B"
110
+
111
+ ,"Cell-3A","Cell-3B"
112
+
113
+ ```
114
+
115
+
116
+
117
+ ならば、`fputcsv()` や BOM 起因と疑う余地はありません。
118
+
119
+
120
+
121
+ ```PHP
122
+
123
+ fputcsv($buf, $titles); // ここまでは期待通りに動作している
124
+
125
+ foreach ($ids as $id) {
126
+
127
+ if (isset($valuess[$id])) {
128
+
129
+ fputcsv($buf, $valuess[$id]); // ここで1列目に入るべきデータが2列目にずれて挿入される
130
+
131
+ }
132
+
133
+ }
134
+
135
+ ```
136
+
137
+
138
+
139
+ 疑うべきは変数 `$valuess` の値であり、1列目が空欄になっていると思われます。
140
+
141
+ `var_dump()` で値を確認して下さい。
142
+
143
+
144
+
145
+ ```PHP
146
+
147
+ var_dump($valuess);
148
+
149
+ ```
150
+
151
+
152
+
153
+ そして、変数 `$valuess` を生成しているコードを見直して下さい。
154
+
155
+
156
+
87
157
  Re: YYama さん

1

1行目?1列目?

2017/07/26 05:44

投稿

think49
think49

スコア18164

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### 1行目が空欄
2
+
3
+
4
+
1
5
  > csvをDLしようとする際、必ず出力されるCSVの第一行目が空になってしまいます。
2
6
 
3
7
  > 具体的には、1列目に入るべき値が2列目に入ってしまっています。
@@ -28,4 +32,56 @@
28
32
 
29
33
 
30
34
 
35
+ ### 1行目?1列目?
36
+
37
+
38
+
39
+ > csvをDLしようとする際、必ず出力されるCSVの第一行目が空になってしまいます。
40
+
41
+ > 具体的には、1列目に入るべき値が2列目に入ってしまっています。
42
+
43
+
44
+
45
+ 「第一行目が空」で1行目と思い込んでいましたが、2行目では「1列目に入るべき値が2列目に入ってしまって」とあります。
46
+
47
+ 「1行目」と「1列目」のどちらが正しいのでしょうか。
48
+
49
+
50
+
51
+ 軽く調べたところ、PHPは基本的に BOM を解釈しないようなので、`fputcsv()` が BOMデータを有効な文字列を判断して、1列目に入るべきデータを「2列目のデータ」と判断して挿入している可能性があります。
52
+
53
+
54
+
55
+ ```
56
+
57
+ BOM,"Cell-1A","Cell-1B"
58
+
59
+ "Cell-2A","Cell-2B"
60
+
61
+ "Cell-3A","Cell-3B"
62
+
63
+ ```
64
+
65
+
66
+
67
+ これは質問文にある状況と一致する為、「1行目の1列目が空欄になってしまう」が正解な気がしますね。
68
+
69
+ 解決法は先述と同様、CSV文字列を自前で組み立てて、`file_put_contents()` で出力する事になります。
70
+
71
+ 調べてみたところ、PHPには `str_getcsv()` はありますが、CSV文字列を生成する関数はないようです。
72
+
73
+
74
+
75
+ - [PHP: str_getcsv - Manual](http://php.net/manual/ja/function.str-getcsv.php)
76
+
77
+
78
+
79
+ ライブラリを探すのも良いですが、それほど難しい仕様ではないので自前で作るのも良いかと思います。
80
+
81
+
82
+
83
+ - [CSVファイルの一般的書式 (RFC4180 日本語訳) - アルプス登山の玄関口・笠井家](http://www.kasai.fm/wiki/rfc4180jp)
84
+
85
+
86
+
31
87
  Re: YYama さん