Пример как преобразовать массив в CSV и сохранить его диске или отдать на скачивание.
Имеем массив $prods
:
$prods = array(
array(
'id' => '697',
'name' => 'Динамический ортез-стоподержатель',
'category' => 'Ортезы',
'price' => '35990 RUB',
),
array(
'id' => '698',
'name' => 'Бандаж на коленный сустав',
'category' => 'Ортезы',
'price' => '3610 RUB',
),
array(
'id' => '699',
'name' => 'Бандаж на плечевой сустав',
'category' => 'Ортезы',
'price' => '3700 RUB',
),
);
Также массив можно заполнить данными из БД:
// Подключение к БД.
$dbh = new PDO('mysql:dbname=НАЗВАНИЕ_БД;host=localhost', 'ЛОГИН', 'ПАРОЛЬ');
$sth = $dbh->prepare("SELECT * FROM `prods`");
$sth->execute();
$array = $sth->fetch(PDO::FETCH_ASSOC);
$prods = array();
foreach($array as $row) {
$prods[] = array(
'id' => $row['id'],
'name' => $row['name'],
'category' => $row['category'],
'price' => $row['price'],
);
}
Преобразуем массив в CSV с помощью функции fputcsv()
, в качестве разделителя используется ;
.
Отдача файла на скачивание
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
$buffer = fopen('php://output', 'w');
fputs($buffer, chr(0xEF) . chr(0xBB) . chr(0xBF));
foreach($prods as $val) {
fputcsv($buffer, $val, ';');
}
fclose($buffer);
exit();
Сохранение файла на сервере
$buffer = fopen(__DIR__ . '/file.csv', 'w');
fputs($buffer, chr(0xEF) . chr(0xBB) . chr(0xBF));
foreach($prods as $val) {
fputcsv($buffer, $val, ';');
}
fclose($buffer);
exit();
Строка fputs($buffer, chr(0xEF) . chr(0xBB) . chr(0xBF));
добавляет в начало файла метку BOM, благодаря этому файл откроется в Excel с нормальной кодировкой.
Результат
Содержание файла file.csv
697;"Динамический ортез-стоподержатель";Ортезы;"35990 RUB"
698;"Бандаж на коленный сустав";Ортезы;"3610 RUB"
699;"Бандаж на плечевой сустав";Ортезы;"3700 RUB"
Пытаюсь массив заполнить данными из БД, но второй день ломаю голову.
Получаю ответ:
Trying to access array offset on value of type null
и смещение рядка "Illegal string offset"
Не могу понять в чем причина. Сможете подсказать?