Saya seorang programmer pemula dan saya banyak mencari tentang pertanyaan saya tetapi tidak dapat menemukan solusi atau tutorial yang bermanfaat tentang ini.
Tujuan saya adalah saya memiliki array PHP dan elemen array ditampilkan dalam daftar di halaman.
Saya ingin menambahkan opsi, sehingga jika pengguna mau, dia dapat membuat file CSV dengan elemen array dan mendownloadnya.
Saya tidak tahu bagaimana melakukan ini. Saya telah mencari banyak juga. Namun belum menemukan sumber daya yang bermanfaat.
Tolong berikan saya beberapa tutorial atau solusi atau saran untuk menerapkannya sendiri. Karena saya seorang pemula, berikan solusi yang mudah diterapkan.
Array saya terlihat seperti:
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] =>
)
)
php
export-to-csv
pengguna2302780
sumber
sumber
Jawaban:
Anda dapat menggunakan built in fputcsv () untuk array Anda untuk menghasilkan baris csv yang benar dari array Anda, jadi Anda harus mengulang dan mengumpulkan baris, seperti ini:
$f = fopen("tmp.csv", "w"); foreach ($array as $line) { fputcsv($f, $line); }
Untuk membuat browser menawarkan dialog "Simpan sebagai", Anda harus mengirim header HTTP seperti ini (lihat lebih lanjut tentang header ini di rfc ):
header('Content-Disposition: attachment; filename="filename.csv";');
Menyatukan semuanya:
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); }
Dan Anda bisa menggunakannya seperti ini:
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" );
Pembaruan:
Daripada
php://memory
Anda juga dapat menggunakanphp://output
untuk deskriptor file dan menghapus pencarian dan semacamnya: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); } }
sumber
echo
garis CSV yang dihasilkan langsung di loop?fputcsv()
tidak mengembalikan baris yang dihasilkan, itu akan memerlukan deskriptor file untuk menulis. Anda dapat memundurkan, menulis, menghapus buffer pada setiap iterasi meskipun jika memori Anda terbatas. Atau gunakan saja file sementara yang sebenarnya.$data = array_merge(array(array_keys($data[0])), $data);
php://output
lihat contoh kode kedua yang diperbarui.Saya tidak punya cukup reputasi untuk membalas solusi @ complex857. Ini bekerja dengan baik, tetapi saya harus menambahkan; di akhir tajuk Content-Disposition. Tanpanya browser menambahkan dua tanda hubung di akhir nama file (misalnya alih-alih "export.csv" file akan disimpan sebagai "export.csv--"). Mungkin mencoba membersihkan \ r \ n di akhir baris header.
Baris yang benar akan terlihat seperti ini:
header('Content-Disposition: attachment;filename="'.$filename.'";');
Jika CSV memiliki karakter UTF-8 di dalamnya, Anda harus mengubah encoding ke UTF-8 dengan mengubah baris Jenis Konten:
header('Content-Type: application/csv; charset=UTF-8');
Juga, saya merasa lebih elegan menggunakan rewind () daripada fseek ():
Terima kasih atas solusinya!
sumber
--
akhir nama file, namun saya telah memperbarui jawabannya (mengapa tidak mengirimkan suntingan saja?)Coba ... 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(); ?>
sumber
Itu adalah fungsi yang saya gunakan untuk proyek saya, dan berfungsi seperti yang diharapkan.
function array_csv_download( $array, $filename = "export.csv", $delimiter=";" ) { header( 'Content-Type: application/csv' ); header( 'Content-Disposition: attachment; filename="' . $filename . '";' ); // clean output buffer ob_end_clean(); $handle = fopen( 'php://output', 'w' ); // use keys as column titles fputcsv( $handle, array_keys( $array['0'] ) ); foreach ( $array as $value ) { fputcsv( $handle, $value , $delimiter ); } fclose( $handle ); // flush buffer ob_flush(); // use exit to get rid of unexpected output afterward exit(); }
sumber
Gunakan kode di bawah ini untuk mengubah array php menjadi CSV
<?php $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'); foreach ($ROW as $row) { fputcsv($fp, $row); } fclose($fp);
sumber
Jika struktur array Anda akan selalu multi-dimensi dengan cara yang persis seperti itu, maka kita dapat melakukan iterasi melalui elemen seperti:
$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);
Itulah salah satu cara untuk melakukannya ... Anda dapat melakukannya secara manual tetapi cara ini lebih cepat dan mudah untuk dipahami dan dibaca.
Kemudian Anda akan mengelola header Anda sesuatu yang dilakukan complex857 untuk mengeluarkan file. Anda kemudian dapat menghapus file menggunakan unlink () jika Anda tidak lagi membutuhkannya, atau Anda dapat meninggalkannya di server jika Anda mau.
sumber
Gunakan yang berikut ini,
echo "<script type='text/javascript'> window.location.href = '$file_name'; </script>";
sumber