2017-12-07 7 views
0

Ich erstelle csv-Datei von meinem Anwesenheitsbericht, und ich verwende fputcsv() Funktion, um es in CSV-Datei zu generieren. Ich habe die Liste der Schüler durchgelaufen, aber sie hat nicht alle Schüler gefunden, sondern nur einen Schüler.fputcsv() fügt keine neue Zeile hinzu

hier ist mein Code:

// 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); 

statt gibt mir dieses Ergebnis:

+---------------------------------------------------+ | id_no | fullname | gender | dec 1 | dec 2 | dec 3 | | 1 | stud1 | male | A | P | P | | 2 | stud2 | male | P | P | P |

das, was ich bekommen ist:

+---------------------------------------------------+ | id_no | fullname | gender | dec 1 | dec 2 | dec 3 | | 1 | stud1 | male | A | P | P |

i abgeladen bereits $students, es hat die Aufzeichnungen von zwei Studenten. Danke Leute!

+1

Sie haben '$ Liste 'Außerhalb der' foreach'-Schleife arbeiten Sie mit nur einem Ergebnis. – panther

+0

was meinst du @panther – Tallgeese

+0

Sie haben eine Reihe von Ergebnissen in '$ Studenten', aber in $ id/fullname/gender haben Sie nur den letzten Datensatz, der in '$ list' und dann in CSV übergeben wird. – panther

Antwort

1

Panther befindet sich direkt im Kommentar oben, sollte es so aussehen:

$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];  
} 

Oder Sie könnten das Array-Stenografie-Syntax vermeiden, das funktioniert auch

$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)); 
} 
+1

es funktioniert wie ein charm man !!!! Danke vielmals!!! Du sparst meinen Tag: D – Tallgeese

Verwandte Themen