回答編集履歴

2

加筆します

2022/07/05 07:41

投稿

退会済みユーザー
test CHANGED
@@ -14,3 +14,47 @@
14
14
  }
15
15
  ```
16
16
  とか。
17
+
18
+ ---
19
+
20
+ 更新されたソースコードを見ましたが、
21
+ `foreach($datas as $data)`ループの内側で
22
+ header()でCSVダウンロードの手順を踏んで出力するの、アルゴリズムとして間違ってますよね。
23
+
24
+ 示されたコードの範囲内で、順序の見直しなどを加えると、こうなる。
25
+
26
+ ```php
27
+ header("Content-Type: application/octet-stream");
28
+ header("Content-Disposition: attachment; filename=商品リスト_{$date}.csv");
29
+
30
+ $head = ['注文ID', '事業者ID', '加盟店名', '加盟店顧客番号', '顧客名', '比較対象', 'アラート内容', '補足情報'];
31
+ mb_convert_variables('SJIS','UTF-8',$head);
32
+
33
+ $stream = fopen('php://output', 'w');
34
+
35
+ fputcsv($stream, $head);
36
+
37
+ foreach ($datas as $data){
38
+ $list = array(
39
+ $data['OrderId'],
40
+ $data['EnterpriseId'],
41
+ $data['EnterpriseNameKj'],
42
+ $data['EntCustId'],
43
+ $data['NameKj'],
44
+ $data['比較対象'],
45
+ "顧客名が誤っている",
46
+ $data['補足情報'],
47
+ );
48
+ mb_convert_variables('SJIS','UTF-8',$list);
49
+
50
+ fputcsv($stream, $list);
51
+ }
52
+ ```
53
+
54
+ ただし、もうちょっとうまいやり方がネット上にいくつもある。
55
+
56
+ [PHPで配列をCSV出力する \- Qiita](https://qiita.com/ryo-futebol/items/8fe86267c099fed05594)
57
+ この事例は、SplFileObjectを使うやり方、一旦一時ファイルにCSV出力したものをダウンロードさせるやり方。
58
+
59
+ 一レコードごとにUTF-8→SJIS変換せず、一旦UTF-8のまま出力して、ファイルまるごとSJIS変換しちゃう方法もできそう。
60
+

1

加筆します

2022/07/05 06:32

投稿

退会済みユーザー
test CHANGED
@@ -1,2 +1,16 @@
1
1
  `fputcsv($stream, $record);`の`$record`がarrayじゃなくstringで渡されてる箇所を特定すればOK。
2
2
  `$list`を詰めてる箇所のソースコードがないので、我々は感知不能。
3
+
4
+ とりあえず現状で出力したいなら
5
+
6
+ ```php
7
+ if (is_array($list)) {
8
+ foreach($list as $record){
9
+ fputcsv($stream, $record);
10
+ }
11
+ }
12
+ else {
13
+ fputcsv($stream, $list);
14
+ }
15
+ ```
16
+ とか。