Как создать и загрузить файл csv из php-скрипта?

Я начинающий программист, и я много раз искал свой вопрос, но не смог найти полезного решения или учебника об этом.

Моя цель: у меня есть массив PHP, и элементы массива отображаются в списке на странице.

Я хочу добавить опцию, чтобы, если пользователь хочет, он может создать файл CSV с элементами массива и загрузить его.

Я не знаю, как это сделать. Я тоже много искал. Но все же найти полезный ресурс.

Пожалуйста, предоставьте мне какой-нибудь учебник или решение или совет для его реализации. Поскольку я новичок, пожалуйста, обеспечьте простоту реализации решений.

Мой массив выглядит так:

Array ( [0] => Array ( [fs_id] => 4c524d8abfc6ef3b201f489c [name] => restaurant [lat] => 40.702692 [lng] => -74.012869 [address] => new york [postalCode] => [city] => NEW YORK [state] => ny [business_type] => BBQ Joint [url] => ) ) 

Solutions Collecting From Web of "Как создать и загрузить файл csv из php-скрипта?"

Вы можете использовать встроенный fputcsv () для своих массивов для создания правильных строк csv из вашего массива, поэтому вам придется перебирать и собирать строки. как:

 $f = fopen("tmp.csv", "w"); foreach ($array as $line) { fputcsv($f, $line) } 

Чтобы браузеры предложили диалог «Сохранить как», вам придется отправлять HTTP-заголовки (см. Подробнее об этом заголовке в rfc ):

 header('Content-Disposition: attachment; filename="filename.csv";'); 

Объединяя все это:

 function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") { // open raw memory as file so no temp files needed, you might run out of memory though $f = fopen('php://memory', 'w'); // loop over the input array foreach ($array as $line) { // generate csv lines from the inner arrays fputcsv($f, $line, $delimiter); } // reset the file pointer to the start of the file fseek($f, 0); // tell the browser it's going to be a csv file header('Content-Type: application/csv'); // tell the browser we want to save it instead of displaying it header('Content-Disposition: attachment; filename="'.$filename.'";'); // make php send the generated csv lines to the browser fpassthru($f); } 

И вы можете использовать его так:

 array_to_csv_download(array( array(1,2,3,4), // this array is going to be the first row array(1,2,3,4)), // this array is going to be the second row "numbers.csv" ); 

Обновить:
Вместо памяти php://memory вы также можете использовать php://output для дескриптора файла и уничтожить поиск и т. Д.

 function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") { header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename="'.$filename.'";'); // open the "output" stream // see http://www.php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq $f = fopen('php://output', 'w'); foreach ($array as $line) { fputcsv($f, $line, $delimiter); } } 

У меня недостаточно репутации, чтобы ответить на решение @ complex857. Он отлично работает, но я должен был добавить; в конце заголовка Content-Disposition. Без него браузер добавляет две тире в конце имени файла (например, вместо «export.csv» файл сохраняется как «export.csv»). Вероятно, он пытается дезинфицировать \ r \ n в конце строки заголовка.

Правильная строка должна выглядеть так:

 header('Content-Disposition: attachment;filename="'.$filename.'";'); 

Если CSV имеет символы UTF-8, вам необходимо изменить кодировку на UTF-8, изменив строку Content-Type:

 header('Content-Type: application/csv; charset=UTF-8'); 

Кроме того, я считаю более элегантным использовать rewind () вместо fseek ():

 rewind($f); 

Спасибо за ваше решение!

 Try... csv download. <?php mysql_connect('hostname', 'username', 'password'); mysql_select_db('dbname'); $qry = mysql_query("SELECT * FROM tablename"); $data = ""; while($row = mysql_fetch_array($qry)) { $data .= $row['field1'].",".$row['field2'].",".$row['field3'].",".$row['field4']."\n"; } header('Content-Type: application/csv'); header('Content-Disposition: attachement; filename="filename.csv"'); echo $data; exit(); ?> 

Используйте приведенный ниже код для преобразования php-массива в CSV-файл

 $ROW=db_export_data();//Will return a php array header("Content-type: application/csv"); header("Content-Disposition: attachment; filename=test.csv"); $fp = fopen('php://output', 'w'); $i=0; foreach ($ROW as $row) { fputcsv($fp, $row); $i++; } fclose($fp); 

Если структура массива всегда будет многомерной таким образом, тогда мы можем выполнять итерацию через такие элементы:

 $fh = fopen('somefile.csv', 'w') or die('Cannot open the file'); for( $i=0; $i<count($arr); $i++ ){ $str = implode( ',', $arr[$i] ); fwrite( $fh, $str ); fwrite( $fh, "\n" ); } fclose($fh); 

Это один из способов сделать это … вы можете сделать это вручную, но этот способ быстрее и понятнее и понятнее.

Тогда вы бы управляли своими заголовками чем-то, что делает complex857, чтобы выплевывать файл. Затем вы можете удалить файл, используя unlink (), если он вам больше не нужен, или вы можете оставить его на сервере, если хотите.