Come creare e scaricare un file CSV da script php?

Sono un programmatore alle prime armi e ho cercato molto sulla mia domanda, ma non sono riuscito a trovare una soluzione o un tutorial utile a riguardo.

Il mio objective è avere un arrays PHP e gli elementi dell'arrays vengono visualizzati in un elenco sulla pagina.

Voglio aggiungere un'opzione, in modo che se un utente vuole, lui / lei può creare un file CSV con gli elementi dell'arrays e scaricarlo.

Non so come farlo. Ho anche cercato molto. Ma ancora per trovare alcuna risorsa utile.

Per favore forniscimi un tutorial o una soluzione o un consiglio per implementarlo da solo. Poiché sono un principiante, fornisci soluzioni facili da implementare.

La mia matrix assomiglia a:

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

Puoi usare fputcsv () incorporato per i tuoi arrays per generare linee csv corrette dall'arrays, quindi dovrai eseguire il loop e raccogliere le linee. piace:

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

Per far sì che i browser offrano la window di dialogo "Salva con nome" dovrai submit intestazioni HTTP come questa (vedi di più su questa intestazione in rfc ):

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

Mettere tutto insieme:

 function arrays_to_csv_download($arrays, $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 arrays foreach ($arrays as $line) { // generate csv lines from the inner arrayss 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); } 

E puoi usarlo in questo modo:

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

Aggiornare:
Invece della php://memory puoi anche usare l' php://output per il descrittore di file e eliminare la ricerca e così via:

 function arrays_to_csv_download($arrays, $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 ($arrays as $line) { fputcsv($f, $line, $delimiter); } } 

Non ho abbastanza reputazione per rispondere alla soluzione @ complex857. Funziona alla grande, ma ho dovuto aggiungere; alla fine dell'intestazione Content-Disposition. Senza di esso il browser aggiunge due trattini alla fine del nome del file (ad esempio, invece di "export.csv" il file viene salvato come "export.csv–"). Probabilmente cerca di disinfettare \ r \ n alla fine della row dell'intestazione.

La linea corretta dovrebbe assomigliare a questa:

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

Nel caso in cui in CSV siano presenti caratteri UTF-8, è necessario modificare la codifica in UTF-8 modificando la row Content-Type:

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

Inoltre, trovo più elegante usare rewind () invece di fseek ():

 rewind($f); 

Grazie per la tua soluzione!

 Try... csv download. <?php mysql_connect('hostname', 'username', 'password'); mysql_select_db('dbname'); $qry = mysql_query("SELECT * FROM tablename"); $data = ""; while($row = mysql_fetch_arrays($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(); ?> 

Usa il codice seguente per convertire un arrays php in CSV

 $ROW=db_export_data();//Will return a php arrays 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); 

Se la struttura dell'arrays sarà sempre multi-dimensionale in quel modo esatto, allora possiamo scorrere gli elementi in questo modo:

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

Questo è un modo per farlo … puoi farlo manualmente ma in questo modo è più veloce e più facile da capire e leggere.

Quindi gestirai le intestazioni su ciò che sta facendo complesso857 per sputare il file. È quindi ansible eliminare il file utilizzando unlink () se non è più necessario, oppure lo si potrebbe lasciare sul server, se lo si desidera.