2013-05-03 16 views
8

配列をcsvに変換したいのですが、結合配列をcsvに変換できます。列ヘッダーを使用したphp配列からcsvへの変換

ただし、ヘッダーを取得できません。

私は、ヘッダーとしてNUMBER型DATEを動的

以下

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 


     ) 

) 

コードは次のとおりですが、ヘッダーは取得できませんが、その値は取得されています。

+2

http://us1.php.net/([ 'array_keys']を使用manual/en/function.array-keys.php)はヘッダの先頭に置かれます。 – Jon

答えて

14

array_keysを使用してキーを取得し、最初にファイルに書き込んでください。

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

これは数値配列を使用していることを前提としています(空ではないことを前提としています)。 arr[0]の設定が保証されていない場合は、array_shiftまたはarray_sliceを使用して最初の要素を抽出できます。 (あるいは、ヘッダーがすでに書かれているかどうかをループに入れることができます。もしそれが真でなければ、それをtrueに設定してヘッダーを印刷してください)。


私がそれをしている間は、array_combineを使用して反対方向(CSVと連想配列の配列)にすることができます。

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

(これはあなたが何の空白行を持っていないと想定しています - 。空白行はdataに組み合わせて入れ非感覚で警告を発行しますarray()を返します)

+0

データ行の1つがヘッダと同じ長さでない場合、csv to配列コードは失敗します。 – FKEinternet

-1

これがためにうまく働いていました私 null $ headerは、キーを割り当てた後はnullになりません。

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

上記と同じくらい短いわけではありませんが、わかりやすくあります。

+0

これは、データの最初の行をファイルに書き込むのではなく、ヘッダーのみを書き込みます。 '$ header'の値も変更されないので、ヘッダーはデータのすべての行について繰り返され、決して実際のデータを書くことはありません。 – FKEinternet

6

DarrenKの回答は判読不能ですが、不完全です。だから、騒音のために。

$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

美しい、非常にクリア。ご協力いただきありがとうございます! – Phoebe

0

ロバート・クラークの答えは非常に近いですが、それでも簡素化を必要とします: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); 
関連する問題