¿Cómo crear y descargar un archivo csv desde php script?

Soy un progtwigdor novato y busqué mucho sobre mi pregunta, pero no pude encontrar una solución útil o un tutorial sobre esto.

Mi objective es tener una matriz PHP y los elementos de la matriz se muestran en una lista en la página.

Quiero agregar una opción para que, si el usuario lo desea, pueda crear un archivo CSV con elementos de la matriz y descargarlo.

No se como hacer esto. He buscado mucho también. Pero aun así, encontrar algún recurso útil.

Por favor, dame algún tutorial o solución o consejo para implementarlo por mi cuenta. Como novato, proporcione soluciones fáciles de implementar.

Mi arreglo se ve así:

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] => ) ) 

Puede usar el built in fputcsv () para sus matrices para generar líneas csv correctas desde su matriz, por lo que tendrá que recorrer y recoger las líneas. me gusta:

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

Para hacer que los navegadores ofrezcan el cuadro de diálogo “Guardar como”, deberá enviar encabezados HTTP como este (consulte más información sobre este encabezado en el archivo rfc ):

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

Poniendolo todo junto:

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

Y puedes usarlo así:

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

Actualizar:
En lugar de la php://memory , también puede utilizar el resultado de php://output para el descriptor de archivo y eliminar la búsqueda y tal:

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

No tengo suficiente reputación para responder a la solución @ complex857. Funciona muy bien, pero tuve que agregar; al final del encabezado Content-Disposition. Sin él, el navegador agrega dos guiones al final del nombre de archivo (por ejemplo, en lugar de “export.csv”, el archivo se guarda como “export.csv–“). Probablemente intente esterilizar \ r \ n al final de la línea de encabezado.

La línea correcta debería verse así:

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

En caso de que CSV tenga caracteres UTF-8, debe cambiar la encoding a UTF-8 cambiando la línea de tipo de contenido:

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

Además, me parece más elegante usar rewind () en lugar de fseek ():

 rewind($f); 

Gracias por tu solución!

 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: attachment; filename="filename.csv"'); echo $data; exit(); ?> 

Usa el siguiente código para convertir una matriz php a 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); 

Si su estructura de matriz siempre será multidimensional de esa manera exacta, entonces podemos iterar a través de los elementos como los siguientes:

 $fh = fopen('somefile.csv', 'w') or die('Cannot open the file'); for( $i=0; $i 

Esa es una forma de hacerlo ... puedes hacerlo manualmente, pero de esta manera es más rápido y fácil de entender y leer.

Entonces administrarías tus encabezados, algo que el complejo857 está haciendo para escupir el archivo. Luego, puede eliminar el archivo usando desvincular () si ya no lo necesita, o puede dejarlo en el servidor si lo desea.