You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:04:14