【问题标题】:php array to csv conversion with column headers带有列标题的 php 数组到 csv 转换
【发布时间】:2013-05-03 20:07:39
【问题描述】:

我想将数组转换为 csv,我可以将关联数组转换为 csv。

但无法获取标题。

我希望 NUMBER TYPE DATE 作为标题动态

下面是我转换的数组。

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);
?>

【问题讨论】:

标签: php


【解决方案1】:

只需使用array_keys 获取密钥并先将它们写入文件。

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

这假设您有一个数字数组(并且假设它不是空的)。如果不保证设置arr[0],则可以使用array_shiftarray_slice 提取第一个元素。 (或者你可以在你的循环中设置一个标头是否已经写入的标志 - 只需将其默认为 false。如果它不是 true,请将其设置为 true 并打印标题。)


当我这样做的时候,您可以使用 array_combine 去相反的方向(CSV 到关联数组的数组)。

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

(请注意,这假设您没有空白行 - 空白行将返回 array(),这将通过组合发出警告并将无意义放入 data。)

【讨论】:

  • 如果其中一个数据行的长度与标题不同,您的 csv 到数组代码将失败。
【解决方案2】:

Robert Clark 的答案非常接近,但仍需要简化:不需要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);

【讨论】:

    【解决方案3】:

    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)
    

    【讨论】:

      【解决方案4】:

      这对我很有效 null $header 一旦分配了键就不会为空,然后行将跟随。

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

      没有上面那么短,但我觉得它很可读。

      【讨论】:

      • 这不会将第一行数据写入文件,只写入文件头。它也不会更改$header 的值,因此每行数据都会重复标题,从不写入任何实际数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2014-11-19
      • 2012-04-28
      • 2020-12-29
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多