Приведу пример, как это было сделано мной для сайта по продаже билетов, из которого будет понятно что и как делается. Получаем массив, и затем этот массив раскладываем по ячейкам, делаем заголовки отчета.
Пример:
<?php
$reserv_seat = $pages->find('template=purchased_tickets, id_bus=' . $selected_id_bus . ', date_depart=' . $selected_date . ',sort=seat');
//echo '<pre>'; print_r($arr_reserv_seat); echo '</pre>';
$arr_reserv_seat = [];
foreach ($reserv_seat as $reserv_seat_item) {
$arr_reserv_seat[] = array(
'seat' => $reserv_seat_item->seat,
'pay_or_booking' => $reserv_seat_item->pay_or_booking,
'confirm' => $reserv_seat_item->confirm,
'passenger' => $reserv_seat_item->passenger,
'passenger_doc' => $reserv_seat_item->passenger_doc,
'operator' => $reserv_seat_item->operator,
);
}
$title = array
(
'Отчет по маршруту ' . $selected_bus . ' - ' . $selected_date . ' ' . $selected_time,
'',
);
$headers = array(
array(
'seat' => 'Место',
'pay_or_booking' => 'Куплен/Забронирован',
'confirm' => 'Статус подтверждения',
'passenger' => 'Пассажир',
'passenger_doc' => 'Документ',
'operator' => 'Оператор',
),
);
header('Content-Type: text/csv; charset=utf-8' );
header(sprintf( 'Content-Disposition: attachment; filename=Отчет по маршруту - %s.csv', date( 'dmY-His' ) ) );
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
$buffer = fopen('php://output', 'w');
foreach ($title as $line) {
$line = mb_convert_encoding($line, 'windows-1251', 'utf-8');
fputcsv($buffer,explode(',',$line));
}
foreach($headers as $val) {
$val = mb_convert_encoding($val, 'windows-1251', 'utf-8');
fputcsv($buffer, $val, ';');
}
foreach($arr_reserv_seat as $val) {
$val = mb_convert_encoding($val, 'windows-1251', 'utf-8');
fputcsv($buffer, $val, ';');
}
fclose($buffer);
exit();
?>