124 votes

Tableau PHP au format CSV

J'essaie de convertir un tableau de produits en un fichier CSV, mais cela ne semble pas se dérouler comme prévu. Le fichier CSV est une longue ligne, voici mon code:

 for($i=0;$i<count($prods);$i++) {
$sql = "SELECT * FROM products WHERE id = '".$prods[$i]."'";
$result = $mysqli->query($sql);
$info = $result->fetch_array(); 
}

$header = '';

for($i=0;$i<count($info);$i++)  
  {
    $row = $info[$i];

    $line = '';
    for($b=0;$b<count($row);$b++)
    { 
    $value = $row[$b];                                      
        if ( ( !isset( $value ) ) || ( $value == "" ) )
        {
            $value = "\t";
        }
        else
        {
            $value = str_replace( '"' , '""' , $value );
            $value = '"' . $value . '"' . "\t";
        }
         $line .= $value;
        }
    $data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );

if ( $data == "" )
{
$data = "\n(0) Records Found!\n";                        
}

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");

array_to_CSV($data);


function array_to_CSV($data)
    {
        $outstream = fopen("php://output", 'r+');
        fputcsv($outstream, $data, ',', '"');
        rewind($outstream);
        $csv = fgets($outstream);
        fclose($outstream);
        return $csv;
    }
 

En outre, l'en-tête ne force pas le téléchargement. J'ai copié et collé la sortie et enregistré au format .csv

MODIFIER

PROBLÈME RÉSOLU:

Si quelqu'un d'autre cherchait la même chose, il a trouvé un meilleur moyen de le faire:

 $num = 0;
$sql = "SELECT id, name, description FROM products";
if($result = $mysqli->query($sql)) {
     while($p = $result->fetch_array()) {
         $prod[$num]['id']          = $p['id'];
         $prod[$num]['name']        = $p['name'];
         $prod[$num]['description'] = $p['description'];
         $num++;        
    }
 }
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv"); 
header("Content-Disposition:attachment;filename=pressurecsv.csv"); 
fputcsv($output, array('id','name','description'));
foreach($prod as $product) {
    fputcsv($output, $product);
}
fclose($output) or die("Can't close php://output");
 

109voto

Martin Lyne Points 1571

Au lieu d'écrire des valeurs, envisagez d'utiliser fputcsv() .

Cela peut résoudre votre problème immédiatement.

5voto

Martyn Shutt Points 191

Essayez d'utiliser;

PHP_EOL

Pour mettre fin à chaque nouvelle ligne dans votre fichier CSV de sortie.

Je suis en supposant que le texte est de délimitation, mais n'est-ce pas aller à la ligne suivante?

C'est une constante PHP. Il permettra de déterminer la bonne fin de la ligne dont vous avez besoin.

Windows, par exemple, utilise "\r\n". J'ai secoué ma cervelle qu'un lors de ma sortie n'était pas la rupture à une nouvelle ligne.

comment écrire unifiée nouvelle ligne dans le PHP?

2voto

Jesse Q Points 100

Dans mon cas, mon tableau est multidimensionnelle, potentiellement avec des tableaux de valeurs. J'ai donc créé cette fonction récursive de faire éclater le tableau complètement:

function array2csv($array, &$title, &$data) {
    foreach($array as $key => $value) {      
        if(is_array($value)) {
            $title .= $key . ",";
            $data .= "" . ",";
            array2csv($value, $title, $data);
        } else {
            $title .= $key . ",";
            $data .= '"' . $value . '",';
        }
    }
}

Depuis les différents niveaux de mon tableau ne se prêtent pas bien à plat format CSV, j'ai créé une colonne vide avec le sous-ensemble de la clé de servir descriptive "intro" pour le prochain niveau de données. Exemple de sortie:

agentid     fname           lname      empid    totals  sales   leads   dish    dishnet top200_plus top120  latino  base_packages
G-adriana   ADRIANA EUGENIA PALOMO PAIZ 886                0    19              0         0         0         0      0

Vous pouvez facilement supprimer cette "intro" (descriptif) de la colonne, mais dans mon cas, j'ai dû répéter les en-têtes de colonne, c'est à dire inbound_leads, dans chaque sous-tableau, qui m'a donné une pause/titre précédent de la prochaine section. Supprimer:

$title .= $key . ",";
$data .= "" . ",";

après la is_array() pour compacter le code plus loin et de supprimer la colonne supplémentaire.

Depuis que j'ai voulu à la fois une ligne de titre et de ligne de données, je passe deux variables dans la fonction et à la fin de l'appel à la fonction, de mettre fin à la fois avec PHP_EOL:

$title .= PHP_EOL;
$data .= PHP_EOL;

Oui, je sais, je laisse une virgule supplémentaire, mais par souci de concision, je n'ai pas à traiter ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X