2017-09-04 1 views
1

J'ai un tableau multidimensionnel dans lequel certaines tableaux manquent une paire clé-valeur qui se trouve dans les autres tableaux. Lorsque je convertis en csv (dans ce cas, délimité par des tabulations), les cellules de colonne d'une ligne se décalent vers la gauche et remplacent la clé/valeur manquante. Par exemple, ce tableau:Suppression des données de colonne en désordre dans csv lorsqu'une paire valeur/clé de tableau est manquante

array 
    (
    array("Make" => "Volvo", "Color" => "red", "Quantity" => 18), 
    array("Make" => "BMW", "Color" => "blue", "Quantity" => 13), 
    array("Make" => "Saab", "Quantity" => 11), 
    array("Make" => "Land Rover", "Color" => "green", "Quantity" => 15) 
); 

VERSION 1

Lorsque j'utilise le code suivant:

$cfilename = 'result.csv'; 
$data = array 
    (
    array("Make" => "Volvo", "Color" => "red", "Quantity" => 18), 
    array("Make" => "BMW", "Color" => "blue", "Quantity" => 13), 
    array("Make" => "Saab", "Quantity" => 11), 
    array("Make" => "Land Rover", "Color" => "green", "Quantity" => 15) 
); 

    //below creates csv 
$fp = fopen($cfilename, 'w'); 
$header = false; 
foreach ($data as $row) 
{ 

fputcsv($fp, $row, chr(9)); 
} 
fclose($fp); 
return; 

me donner quelque chose comme ceci:

Volvo  |red | 18 
BMW  |blue | 13 
Saab  |11  | 
Land Rover |green | 15 

I peut obtenir les colonnes à aligner correctement si j'utilise les étiquettes de clés pour wri les en-têtes. Mais dans ce cas, au lieu que la cellule pour la paire clé/valeur manquante soit vide, le numéro de colonne est imprimé à sa place.

VERSION 2 Ce code:

$cfilename = 'result.csv'; 
$data = array 
    (
    array("Make" => "Volvo", "Color" => "red", "Quantity" => 18), 
    array("Make" => "BMW", "Color" => "blue", "Quantity" => 13), 
    array("Make" => "Saab", "Quantity" => 11), 
    array("Make" => "Land Rover", "Color" => "green", "Quantity" => 15) 
); 

//below creates csv 
$fp = fopen($cfilename, 'w'); 
$header = false; 
foreach ($data as $row) 
{ 
    if (empty($header)) //creates header, chr(9) makes tab delimited 
    { 
     $header = array_keys($row); 
     fputcsv($fp, $header, chr(9)); 
     $header = array_flip($header); 
    } 
    fputcsv($fp, array_merge($header, $row), chr(9)); //creates rows, chr(9) makes tab delimited 
} 
fclose($fp); 
return; 

Résultats: dans cette

Make  | Color | Quantity 
-----------|-------|---- 
Volvo  |red | 18 
BMW  |blue | 13 
Saab  |1  | 11 
Land Rover | green | 15 

note, le "1" sous la couleur de la ligne "Saab".

Obtenir l'une ou l'autre version fonctionnerait bien, si c'est la version 1, sans les en-têtes, je peux toujours ajouter cette ligne dans le fichier de sortie délimité par des tabulations.

Répondre

1

La valeur est 1 parce que c'est la valeur dans le tableau $header pour la clé de couleur (vous lanciez avant la fusion, donc au lieu d'être 1 => "Color", maintenant il est "Color" => 1). Qu'est-ce que vous pouvez faire pour se débarrasser de ce met toutes les valeurs à NULL, ou une chaîne vide, ou un espace réservé, ou tout ce que vous voulez être là quand il n'y a pas de valeur, avec array_map():

<?php 
$cfilename = 'result.csv'; 
$data = array 
    (
    array("Make" => "Volvo", "Color" => "red", "Quantity" => 18), 
    array("Make" => "BMW", "Color" => "blue", "Quantity" => 13), 
    array("Make" => "Saab", "Quantity" => 11), 
    array("Make" => "Land Rover", "Color" => "green", "Quantity" => 15) 
); 
echo "<pre>"; 
//below creates csv 
$fp = fopen($cfilename, 'w'); 
$header = false; 
foreach ($data as $row) 
{ 
    if (empty($header)) //creates header, chr(9) makes tab delimited 
    { 
     $header = array_keys($row); 
     fputcsv($fp, $header, chr(9)); 
     $header = array_flip($header); 
     $header = array_map(function($header) { return "";}, $header); 
    } 
    // var_dump($header); 
    fputcsv($fp, array_merge($header, $row), chr(9)); //creates rows, chr(9) makes tab delimited 

} 
fclose($fp); 
return; 

Demo (without saving to file, only printing to screen)

1

Pourquoi ne pas simplement définir le champ à une chaîne vide s'il n'existe pas?

$cfilename = 'result.csv'; 
$data = array(
    array("Make" => "Volvo", "Color" => "red", "Quantity" => 18), 
    array("Make" => "BMW", "Color" => "blue", "Quantity" => 13), 
    array("Make" => "Saab", "Quantity" => 11), 
    array("Make" => "Land Rover", "Color" => "green", "Quantity" => 15) 
); 

//below creates csv 
$fp = fopen($cfilename, 'w'); 
$header = false; 
$fields = ['Make', 'Color', 'Quantity']; 
foreach ($data as $row) 
{ 
    foreach($fields as $field) { 
     if (!array_key_exists($field, $row) { 
      $row[$field] = ''; 
     } 
    } 
    fputcsv($fp, $row, chr(9)); 
} 
fclose($fp); 
return;