Как заставить fputcsv «эхо» данных - PullRequest
27 голосов
/ 14 января 2011

Мне нужен способ заставить функцию fputscv записывать данные в браузер на лету вместо создания временного файла, сохранения данных в этом файле и выполнения echo file_get_contents().

Ответы [ 4 ]

43 голосов
/ 14 января 2011

Нашел это на веб-сайте PHP docs, первый комментарий под ссылкой на функцию:

function outputCSV($data) {
  $outstream = fopen("php://output", 'w');
  function __outputCSV(&$vals, $key, $filehandler) {
    fputcsv($filehandler, $vals, ';', '"');
  }
  array_walk($data, '__outputCSV', $outstream);
  fclose($outstream);
}

И второй вариант:

$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
fputcsv($csv, array('blah','blah'));
rewind($csv);

// put it all in a variable
$output = stream_get_contents($csv);

Надеюсь, это поможет!

Кстати, документы PHP всегда должны быть вашей первой остановкой при попытке разобраться. : -)

16 голосов
/ 14 января 2011

По комментарию на сайте PHP

<?php
$out = fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
2 голосов
/ 06 мая 2015

Поскольку первоначальный аскер хотел «писать в браузер на лету», возможно, стоит отметить (как это было в моем случае, и никто не упомянул об этом), что если вы хотите принудительно ввести имя файла и диалоговое окно с просьбой загрузить файлв браузере вы должны установить правильные заголовки перед выводом чего-либо с помощью fputcsv:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=myFile.csv');
0 голосов
/ 10 февраля 2019

Создание CSV на самом деле не так сложно (анализ CSV немного сложнее).

Пример кода для записи 2D-массива в формате CSV:

$array = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
];

// If this CSV is a HTTP response you will need to set the right content type
header("Content-Type: text/csv"); 

// If you need to force download or set a filename (you can also do this with 
// the download attribute in HTML5 instead)
header('Content-Disposition: attachment; filename="example.csv"')

// Column heading row, if required.
echo "Column heading 1,Column heading 2,Column heading 3\n"; 

foreach ($array as $row) {
    $row = array_map(function($cell) {
        // Cells containing a quote, a comma or a new line will need to be 
        // contained in double quotes.
        if (preg_match('/["\n,]/', $cell)) {
            // double quotes within cells need to be escaped.
            return '"' . preg_replace('/"/', '""', $cell) . '"';
        }

        return $cell;
    }, $row);

    echo implode(',', $row) . "\n";
}
...