CodeIgniter中如何按指定格式将JSON数据写入CSV文件?
我来帮你搞定这个CSV导出的问题!看起来你已经把JSON数据解码成了$details数组,现在需要把它导出成可下载的CSV文件,我给你完善并优化代码,分两种场景处理:
场景1:把answers字段拆分成单独列(推荐,更易读)
如果希望CSV里每个问题都是单独的列(比如question1、q2等),可以先把answers的字符串拆成关联数组,再合并到原数据中,然后导出:
<?php // 假设$details是你已经解码好的数组,$id是你的变量 $details = [ [ "name" => "Abc", "class" => "12", "date" => "14-04-2018", "answers" => "question1 : answer1, q2 : a2, q3 : a3, q4 : a4" ] ]; // 第一步:拆分answers字段为单独的键值对 foreach ($details as &$item) { $answersArr = []; // 按逗号加空格拆分每个问答对 $pairs = explode(', ', $item['answers']); foreach ($pairs as $pair) { // 按" : "拆分问题和答案 list($question, $answer) = explode(' : ', $pair); $answersArr[$question] = $answer; } // 删除原answers字段,合并拆分后的问答数组 unset($item['answers']); $item = array_merge($item, $answersArr); } unset($item); // 解除引用避免后续意外修改 // 第二步:设置CSV下载的HTTP头 $filename = 'logs_'.$id.'.csv'; // 清除输出缓冲,防止之前的输出干扰CSV内容 ob_clean(); flush(); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=\"$filename\""); header("Content-Type: text/csv; charset=utf-8"); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); // 第三步:写入CSV内容 $output = fopen('php://output', 'w'); // 写入表头(取第一个数组的键作为列名) if (!empty($details)) { fputcsv($output, array_keys($details[0])); // 逐行写入数据 foreach ($details as $row) { fputcsv($output, $row); } } fclose($output); exit; // 终止脚本,确保没有后续输出 ?>
场景2:保留answers字段原样
如果不需要拆分,直接把answers作为一个整列写入CSV,代码更简洁:
<?php $details = [ [ "name" => "Abc", "class" => "12", "date" => "14-04-2018", "answers" => "question1 : answer1, q2 : a2, q3 : a3, q4 : a4" ] ]; $filename = 'logs_'.$id.'.csv'; ob_clean(); flush(); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=\"$filename\""); header("Content-Type: text/csv; charset=utf-8"); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public"); $output = fopen('php://output', 'w'); // 表头直接用原数组的键 if (!empty($details)) { fputcsv($output, array_keys($details[0])); foreach ($details as $row) { fputcsv($output, $row); } } fclose($output); exit; ?>
关键注意点:
- 使用
php://output直接输出到浏览器,无需生成临时文件,节省服务器资源 fputcsv函数会自动处理CSV的格式问题(比如字段包含逗号时自动用引号包裹)- 加入
ob_clean()和flush()是为了清除之前可能的输出(比如空格、echo内容),避免CSV下载后内容混乱 - 指定
charset=utf-8可以避免中文等非ASCII字符出现乱码问题
内容的提问来源于stack exchange,提问作者mk1024
相关产品推荐
相关产品推荐

