如何用PHP将JSON数组转为MailChimp可识别的正确CSV格式?
问题分析与解决方案
首先看你的代码,核心问题出在循环中使用固定的$timestamp作为数组键——你在循环外只计算了一次时间戳,所以每次循环执行$list[$timestamp] = $new时,都会覆盖掉之前的条目,最终CSV里只会保留表头和最后一条数据,这肯定和你预期的多行数据不符。
另外还有两个小细节可能影响MailChimp的读取:
file_get_contents的第二个参数用错了,你把json_decode的参数写到这里了- MailChimp要求CSV文件是UTF-8编码,最好加上BOM确保兼容性
修正后的代码
// 读取JSON文件并解析为关联数组(修正file_get_contents的参数错误) $jsonDecoded = json_decode(file_get_contents('emails.json'), true); // 初始化CSV表头 $list = [['Email Address', 'First Name']]; // 循环遍历JSON数据,直接追加到数组末尾(不再用固定键覆盖) foreach($jsonDecoded as $entry) { // 确保字段存在,避免报错(可选但推荐) $email = $entry['email'] ?? ''; $name = $entry['name'] ?? ''; $list[] = [$email, $name]; } // 生成CSV文件,确保UTF-8编码(添加BOM兼容MailChimp) $fp = fopen('emails.csv', 'w'); // 写入UTF-8 BOM,让MailChimp正确识别编码 fwrite($fp, "\xEF\xBB\xBF"); foreach ($list as $fields) { fputcsv($fp, $fields); } fclose($fp);
关键修改点说明
- 修复数组追加逻辑:用
$list[] = $new替代$list[$timestamp] = $new,这样每次循环都会在数组末尾新增一行,不会覆盖之前的数据。 - 修正
file_get_contents参数:移除了多余的true参数,file_get_contents的第二个参数是use_include_path,这里不需要启用,我们只需要读取当前目录的文件。 - 添加UTF-8 BOM:MailChimp对CSV编码很敏感,写入
\xEF\xBB\xBF可以确保文件被识别为UTF-8格式,避免乱码或读取失败。 - 字段容错处理:用
?? ''确保即使JSON里缺少email或name字段,代码也不会报错,而是写入空值,符合CSV的格式要求。
这样生成的CSV就会和你预期的格式一致,能被MailChimp正确读取了。
内容的提问来源于stack exchange,提问作者boogie234
相关产品推荐
相关产品推荐

