2013-05-03 16 views
8

Voglio convertire l'array in csv, in grado di convertire l'array associativo in csv.php array alla conversione csv con intestazioni di colonna

Ma non in grado di ottenere le intestazioni.

io desidera che la data numero del tipo come header in modo dinamico

Di seguito è riportato l'array i converrted.

Array 
(
    [0] => Array 
     (
      [NUMBER] => 67 
      [TYPE] => Other 
      [DATE] => 3/31/2011 
     ) 
    [1] => Array 
      (
      [NUMBER] => 87 
      [TYPE] => something 
      [DATE] => 3/28/2011 


     ) 
    [2] => Array 
      (
      [NUMBER] => 67 
      [TYPE] => Other 
      [DATE] => 3/2/2011 


     ) 

) 

Il codice è riportato di seguito. Ma non è possibile ottenere le intestazioni ma i valori sono in arrivo.

<? 
$fp1 = fopen('file.csv', 'w'); 

foreach ($arr2 as $fields) 
{ 
    fputcsv($fp1, $fields); 
} 

fclose($fp1); 
?> 
+2

uso [ 'array_keys'] (http://us1.php.net/ manual/en/function.array-keys.php) all'inizio della funzione per inserire le intestazioni. – Jon

risposta

14

Basta usare array_keys per ottenere le chiavi e li scrivere sul file prima.

fputcsv($han, array_keys($arr[0])); 
foreach ($arr as $a) { ... } 

Ciò presuppone che si disponga di un array numerico (e presuppone che non sia vuoto). Se non è possibile impostare arr[0], è possibile utilizzare array_shift o array_slice per estrarre il primo elemento. (Oppure si potrebbe semplicemente avere una bandiera nel loop o meno l'intestazione è già scritto -.. Basta IT predefinito false Se non è vero, impostarlo su true e stampare l'intestazione)


Mentre ci sono, è possibile utilizzare array_combine per andare nella direzione opposta (CSV alla matrice di array associativi).

$data = array(); 
$header = fgetcsv($han); 
while (($row = fgetcsv($han)) !== false) { 
    $data[] = array_combine($header, $row); 
} 

(Si noti che questo presuppone che ci sono righe vuote - una riga vuota restituirebbe array() che emetterà un avviso con la mietitrebbia e mettere non-senso in data.)

+0

Il tuo codice csv per array fallirà se una delle righe di dati non ha la stessa lunghezza dell'intestazione. – FKEinternet

-1

Questo ha funzionato bene per me null $ header non sarà nullo una volta assegnate le chiavi, seguiranno le righe.

$header=null; 
$createFile = fopen($pathToGenerate,"w+"); 
foreach ($assocArray as $row) { 
    if(!$header){ 
     fputcsv($createFile,array_keys($row)); 
    }else{ 
    fputcsv($createFile, $row); 
    } 
} 
fclose($createFile); 

non così breve come sopra, ma lo trovo abbastanza leggibile.

+0

Questo non scrive la prima riga dei dati nel file, solo l'intestazione. Inoltre, non cambia il valore di '$ header' in modo che le intestazioni vengano ripetute per ogni riga di dati, senza mai scrivere dati effettivi. – FKEinternet

6

La risposta di DarrenK è leggibile ma incompleta. Quindi per i noephytes.

$pathToGenerate = 'array.csv'; // your path and file name 
    $header=null; 
    $createFile = fopen($pathToGenerate,"w+"); 
    foreach ($array as $row) { 

     if(!$header) { 

      fputcsv($createFile,array_keys($row)); 
      fputcsv($createFile, $row); // do the first row of data too 
      $header = true; 
     } 
     else { 

      fputcsv($createFile, $row); 
     } 
    } 
    fclose($createFile) 
+0

Bello, molto chiaro. Grazie per l'aiuto! – Phoebe

0
risposta di

Robert Clark è molto vicino, ma ha ancora bisogno di una semplificazione: Non c'è necessità della clausola di else:

$pathToGenerate='array.csv'; // your path and file name 
    $header=FALSE; 
    $createFile=fopen($pathToGenerate,'w+'); 
    foreach ($array as $row) 
    { if (!$header) 
     { fputcsv($createFile,array_keys($row)); 
      $header=TRUE; 
     } 
     fputcsv($createFile,$row); // write the data for all rows 
    } 
    fclose($createFile);