web-dev-qa-db-fra.com

Comment faire fputcsv "echo" les données

J'ai besoin d'un moyen de faire en sorte que la fonction fputscv écrive des données dans le navigateur à la volée au lieu de créer un fichier temporaire, d'enregistrer des données dans ce fichier et d'effectuer une opération echo file_get_contents().

27
Salman A

Trouvé ceci sur le site Web PHP docs, premier commentaire sous la référence de la fonction:

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

Et une deuxième option:

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

J'espère que cela t'aides!

BTW les PHP docs devraient toujours être votre premier arrêt lorsque vous essayez de comprendre les choses. :-)

42
Seb Barre

Par un commentaire sur le site PHP

<?php
$out = fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
16
powtac

Comme le demandeur initial voulait "écrire sur le navigateur à la volée", il est peut-être intéressant de noter (comme c'était mon cas et personne ne l'a mentionné) que si vous voulez forcer un nom de fichier et une boîte de dialogue demandant de télécharger un fichier dans le navigateur , vous devez définir les en-têtes appropriés avant de générer quoi que ce soit avec fputcsv:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=myFile.csv');
2
Pere

Produire un fichier CSV n’est en fait pas si difficile (l’analyse d’un fichier CSV est un peu plus compliquée).

Exemple de code pour l'écriture d'un tableau 2D au format 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";
}
0
Lee Kowalkowski