如何使用PHP将两个数组导出为带双表头双列的CSV文件
问题原因
你构造的$data结构错误:你将两个完整的一维数组作为了单一行的两个字段值,CSV输出时会把整个数组转为字符串放在对应列,无法实现两个数组同索引元素对应为一行两列的效果。同时你提供的原始代码存在语法错误,$data数组定义没有完成闭合。
修正方案
你需要先将两个数组按索引配对,逐行构造CSV需要的二维数据结构,示例代码如下:
// 假设你的两个原始数组为$first_array、$second_array $first_array = ['KDS-1655B', 'KS-9916', 'KDS-1197', 'KDS-4164', 'MRK-1994', 'KDS-9773']; $second_array = ['PRODUCTNAME1', 'PRODUCTNAME2', 'PRODUCTNAME3', 'PRODUCTNAME4', 'PRODUCTNAME5', 'PRODUCTNAME6']; $filename = 'mycsv.csv'; $delimiter = ','; $f = fopen('php://memory', 'w'); // 写入表头 $headings = ['firstheader', 'secondheader']; fputcsv($f, $headings, $delimiter); // 按索引配对两个数组的元素,逐行写入 // 取两个数组的最小长度作为遍历上限,避免下标越界 $maxIndex = min(count($first_array), count($second_array)); for ($i = 0; $i < $maxIndex; $i++) { $row = [ $first_array[$i], $second_array[$i] ]; fputcsv($f, $row, $delimiter); } // 输出CSV文件 fseek($f, 0); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="' . $filename . '";'); fpassthru($f); fclose($f); exit();
说明
- 代码中用
min()取两个数组的最小长度作为遍历边界,避免两个数组长度不一致时出现下标不存在的报错 - 每次遍历都取两个数组同下标的值组成一行,写入CSV后自然对应两个表头的两列内容
- 同时修正了原始代码中
filename参数的HTML实体转义问题,直接用双引号包裹文件名即可
内容的提问来源于stack exchange,提问作者Arda Ustundag
相关产品推荐
相关产品推荐

