Я пытаюсь преобразовать сгенерированную таблицу php / mysql в загружаемый файл csv. Когда пользователь вводит параметры поиска, выполняется вызов в таблицу mysql и результаты возвращаются в виде таблицы.
Я использовал решение, предлагаемое в этом потоке, и оно работает сказочно: создайте файл CSV для пользователя в PHP
Я могу разрешить пользователям сохранять или просматривать результаты в виде файла csv. проблема, с которой я столкнулась, – я не уверен, как добавить заголовки столбцов в файл. Например, возвращаемые результаты имеют следующий формат: $ result [x] ['office'], $ result [x] ['user'] и т. Д., Но я также хочу добавить названия столбцов, например «Офис» и «Пользователь», чтобы каждый, кто смотрит файл csv, сразу узнал, что означают данные.
Это функция, которая генерирует файл csv:
header("Content-type: text/csv"); header("Content-Disposition: attachment; filename=$file.csv"); header("Pragma: no-cache"); header("Expires: 0"); outputCSV($data); function outputCSV($data) { $outstream = fopen("php://output", "a"); function __outputCSV(&$vals, $key, $filehandler) { fputcsv($filehandler, $vals); // add parameters if you want } array_walk($data, "__outputCSV", $outstream); fclose($outstream); }
Я попытался создать следующую функцию, а затем вызывать ее прямо перед вызовом outputCSV, но это не удается:
function create_file_header() { $headers = 'Office, User, Tag, Value'; $fp = fopen("php://output", "w"); file_put_contents("$file.csv", $headers); fclose($fp); }
Любая помощь приветствуется.
Чтобы создать заголовки, вы должны просто добавить массив строк заголовка и использовать fputcsv
как обычно.
Вы не говорите о формате $data
, но если это ассоциативный массив, вы можете сделать это для общего решения:
function toCSV($data, $outstream) { if (count($data)) { // get header from keys fputcsv($outstream, array_keys($data[0])); // foreach ($data as $row) { fputcsv($outstream, $row); } } }
Я не вижу преимущества array_walk()
над циклом foreach
.
Сделайте это до вызова outputCSV:
array_unshift($data, array('Office', 'User', 'Tag', 'Value'));
Или, если элементы $data
являются ассоциативными массивами, это будет более динамичным:
array_unshift($data, array_keys($data[0]));
Не могли бы вы просто поместить его в функцию outputCSV?
header("Content-type: text/csv"); header("Content-Disposition: attachment; filename=$file.csv"); header("Pragma: no-cache"); header("Expires: 0"); outputCSV($data); function outputCSV($data) { $outstream = fopen("php://output", "a"); $headers = 'Office, User, Tag, Value'; fwrite($outstream,$headers); function __outputCSV(&$vals, $key, $filehandler) { fputcsv($filehandler, $vals); // add parameters if you want } array_walk($data, "__outputCSV", $outstream); fclose($outstream); }
Добавьте необязательный параметр $headers
к вашей функции outputCSV
. Если ваш код передает их, они будут добавлены в массив csv:
outputCSV($data, array('Office', 'User')); // function outputCSV($data, $headers = null) { $outstream = fopen("php://output", "a"); function __outputCSV(&$vals, $key, $filehandler) { fputcsv($filehandler, $vals); // add parameters if you want } if ($headers) { $data = array_merge(array($headers), $data); } array_walk($data, "__outputCSV", $outstream); fclose($outstream); }