fputcsv() 没有添加新行
fputcsv() is not adding new row
我正在生成我的出勤报告的 csv 文件,我正在使用 fputcsv()
函数将其生成为 csv 文件。我循环了学生名单,但它没有检索到所有学生,它只给我一个学生。
这是我的代码:
// Fetch Students
$students = $this->db->table('sys_user')
->select('*', DB::raw($gc))
->leftjoin('sys_user_student', 'sys_user_student.user_id', '=', 'sys_user.user_id')
->leftjoin('sys_mf_section', 'sys_mf_section.section_id', '=', 'sys_user_student.section_id')
->leftjoin('sys_mf_grade', 'sys_mf_grade.grade_id', '=', 'sys_user_student.grade_id')
->leftjoin('gen_access_control_log', 'gen_access_control_log.user_id', '=', 'sys_user.user_id')
->where(function($query) use ($search_from,$search_to){
$query->whereBetween(DB::raw('Date(gen_access_control_log.created_at)'), [$search_from,$search_to]);
})
->where('sys_user.user_type_id', "4")
->where('sys_mf_section.section_id', $section_name)
->where('sys_mf_grade.grade_id', $grade_name)
->where('gen_access_control_log.status', "entrance")
->groupby('gen_access_control_log.user_id')
->get()->toArray();
// ------------------------ EXPORT TO CSV -------------------------//
// Filename
$filename = "Attendance ".$search_from." - ".$search_to;
// Content
$header = array('Student No.', 'Fullname', 'Gender');
$head_merge = array_merge($header,$date_array);
foreach ($students as $key => $value) {
$id = $value->identification_number;
$fullname = $value->last_name.", ".$value->first_name;
$gender = $value->gender;
}
$list = array (
$head_merge,
array($id,$fullname,$gender)
);
// Generate CSV
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename=' . $filename);
header("Content-Transfer-Encoding: UTF-8");
$fp = fopen('php://output', 'w');
foreach ($list as $key => $value) {
fputcsv($fp, $value);
}
fclose($fp);
而不是给我这个结果:
+---------------------------------------------------+
| id_no | fullname | gender | dec 1 | dec 2 | dec 3 |
| 1 | stud1 | male | A | P | P |
| 2 | stud2 | male | P | P | P |
这是我得到的:
+---------------------------------------------------+
| id_no | fullname | gender | dec 1 | dec 2 | dec 3 |
| 1 | stud1 | male | A | P | P |
我已经甩了$students
,里面有两个学生的记录。谢谢大家!
Panther在上面的评论中是正确的,它应该看起来更像这样:
$list = [];
$list[]=$head_merge;
foreach ($students as $key => $value) {
$id = $value->identification_number;
$fullname = $value->last_name.", ".$value->first_name;
$gender = $value->gender;
$list[]=[$id,$fullname,$gender];
}
或者您可以避免数组-shorthand 语法,它也有效
$list = array();
array_push($list, $head_merge);
foreach ($students as $key => $value) {
$id = $value->identification_number;
$fullname = $value->last_name.", ".$value->first_name;
$gender = $value->gender;
array_push($list, array($id,$fullname,$gender));
}
我正在生成我的出勤报告的 csv 文件,我正在使用 fputcsv()
函数将其生成为 csv 文件。我循环了学生名单,但它没有检索到所有学生,它只给我一个学生。
这是我的代码:
// Fetch Students
$students = $this->db->table('sys_user')
->select('*', DB::raw($gc))
->leftjoin('sys_user_student', 'sys_user_student.user_id', '=', 'sys_user.user_id')
->leftjoin('sys_mf_section', 'sys_mf_section.section_id', '=', 'sys_user_student.section_id')
->leftjoin('sys_mf_grade', 'sys_mf_grade.grade_id', '=', 'sys_user_student.grade_id')
->leftjoin('gen_access_control_log', 'gen_access_control_log.user_id', '=', 'sys_user.user_id')
->where(function($query) use ($search_from,$search_to){
$query->whereBetween(DB::raw('Date(gen_access_control_log.created_at)'), [$search_from,$search_to]);
})
->where('sys_user.user_type_id', "4")
->where('sys_mf_section.section_id', $section_name)
->where('sys_mf_grade.grade_id', $grade_name)
->where('gen_access_control_log.status', "entrance")
->groupby('gen_access_control_log.user_id')
->get()->toArray();
// ------------------------ EXPORT TO CSV -------------------------//
// Filename
$filename = "Attendance ".$search_from." - ".$search_to;
// Content
$header = array('Student No.', 'Fullname', 'Gender');
$head_merge = array_merge($header,$date_array);
foreach ($students as $key => $value) {
$id = $value->identification_number;
$fullname = $value->last_name.", ".$value->first_name;
$gender = $value->gender;
}
$list = array (
$head_merge,
array($id,$fullname,$gender)
);
// Generate CSV
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename=' . $filename);
header("Content-Transfer-Encoding: UTF-8");
$fp = fopen('php://output', 'w');
foreach ($list as $key => $value) {
fputcsv($fp, $value);
}
fclose($fp);
而不是给我这个结果:
+---------------------------------------------------+
| id_no | fullname | gender | dec 1 | dec 2 | dec 3 |
| 1 | stud1 | male | A | P | P |
| 2 | stud2 | male | P | P | P |
这是我得到的:
+---------------------------------------------------+
| id_no | fullname | gender | dec 1 | dec 2 | dec 3 |
| 1 | stud1 | male | A | P | P |
我已经甩了$students
,里面有两个学生的记录。谢谢大家!
Panther在上面的评论中是正确的,它应该看起来更像这样:
$list = [];
$list[]=$head_merge;
foreach ($students as $key => $value) {
$id = $value->identification_number;
$fullname = $value->last_name.", ".$value->first_name;
$gender = $value->gender;
$list[]=[$id,$fullname,$gender];
}
或者您可以避免数组-shorthand 语法,它也有效
$list = array();
array_push($list, $head_merge);
foreach ($students as $key => $value) {
$id = $value->identification_number;
$fullname = $value->last_name.", ".$value->first_name;
$gender = $value->gender;
array_push($list, array($id,$fullname,$gender));
}