2013-05-03 2 views
8

Я хочу преобразовать массив в csv, im, чтобы преобразовать ассоциативный массив в csv.php массив для преобразования csv с заголовками столбцов

Но не в состоянии получить заголовки.

Я хочу, чтобы номер типа DATE как заголовки динамически

Ниже массив я 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 


     ) 

) 

Код приведен ниже. Но не в состоянии получить заголовки, но его значения приближаются.

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

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

fclose($fp1); 
?> 
+2

использования [ 'array_keys'] (http://us1.php.net/ 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 для извлечения первого элемента. (Или вы могли бы просто иметь флаг в вашем цикле или нет заголовка уже написано -.. Просто он по умолчанию ложь Если это не так, установите его верно и напечатать заголовок)


Пока я нахожусь, вы можете использовать array_combine, чтобы перейти в противоположном направлении (CSV к массиву ассоциативных массивов).

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

(Обратите внимание, что это предполагает, что у вас нет пустых строк - пустая строка будет возвращать array(), который будет выдавать предупреждение с комбината и поставить нонсенс в data.)

+0

Ваш код csv для массива завершится с ошибкой, если одна из строк данных не будет такой же длины, как и заголовок. – FKEinternet

-1

Это работал хорошо для me 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); 
Смежные вопросы