如何在PHP CodeIgniter中为CSV的逗号分隔值新增列
解决CodeIgniter中CSV导出时拆分活动列为多列的问题
你的问题核心是:虽然用explode拆分了活动字符串,但未将拆分后的活动数组合并到原学生信息数组中,直接输出了原$line数组,导致拆分效果没体现在CSV里。以下是修改后的完整代码及关键说明:
修改后的代码
public function export_stdinfo() { $filename = 'std_info.csv'; $path = 'folder_path'; if (!file_exists($path)){ mkdir($path, 0777, true); } $stdinfo = $this->Std_Model->get_stdinfo(); $output = fopen($path.$filename, 'w'); // 统计所有学生中活动的最大数量,用于生成动态表头 $maxActivities = 0; foreach ($stdinfo as $line) { $activityCount = count(explode(",", $line['Activities'])); $maxActivities = $activityCount > $maxActivities ? $activityCount : $maxActivities; } // 构造表头:基础字段 + 对应数量的活动列 $header = ['Std.rollno','Std.class','Std_name']; for ($i=1; $i<=$maxActivities; $i++) { $header[] = "Activity {$i}"; } fputcsv($output, $header); // 遍历处理每条学生数据 foreach ($stdinfo as $line) { // 拆分活动字符串为数组 $activities = explode(",", $line['Activities']); // 移除原数组中冗余的Activities字段 unset($line['Activities']); // 合并学生基础信息与拆分后的活动数组 $exportLine = array_merge($line, $activities); // 写入CSV行 fputcsv($output, $exportLine); } fclose($output); $file_url = $path.$filename; header('Content-Type: application/octet-stream'); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"".$filename."\""); readfile($file_url); exit; }
关键修改说明
- 动态表头适配:先遍历所有学生数据统计最大活动数,生成对应数量的
Activity 1、Activity 2...表头,避免列数不匹配问题。 - 数组合并逻辑:用
unset移除原数组中的Activities字段,再通过array_merge将拆分后的活动数组合并到学生信息数组末尾,实现活动列拆分。 - 兼容活动数量差异:若不同学生活动数量不同,
array_merge会自动补位,CSV对应位置留空,符合格式规范。
如果你的业务场景中活动数量是固定值(比如每个学生最多3个活动),可以直接写死表头,省略动态统计步骤,比如:
$header = ['Std.rollno','Std.class','Std_name','Activity 1','Activity 2','Activity 3'];
内容的提问来源于stack exchange,提问作者Jackson
相关产品推荐
相关产品推荐

