从CSV到带有标题键的数组,现在返回CSV

时间:2016-08-10 22:39:55

标签: php csv multidimensional-array flatten fputcsv

我们的故事:(如果您急于排除故障,请在下方提供简短版本)

在广泛搜索获取multidimensional array (with named keys)其CSV文件的方法后,会询问此问题。你可能会说:"但这可以在SO的多个页面上覆盖,更好地搜索!"但是我们做了,结果我们发现我们试图屈服于我们的意愿,但失败了。

首先,原因是从CSV中删除了干扰我们的其他查询和代码的列。

现在我们回过头来问SO:

我们已经使用标题'将CSV读入多维数组。第一行作为关键名称。

然后我们使用unset($array[$i]['insert_date']);删除数组中的列

我们还str_replace'd变量中的$header列名称。

因此,我们广泛阅读csv,将它们放入具有数字第一索引的令人敬畏的数组中,以及以CSV文件的第一行命名的第二维键。

我们还将CSV文件中的原始标题存储在一个名为$header的变量中,其变量字符如下:'"brand";"category";"category_path"

所以.. $header是一个字符串,$array是我们的多维数组。

我们想要做的就是,我们在循环后循环编辑,就是创建一个全新的文件,我们的$header作为第一行,我们的$array's值作为字符串..

要写入的文件:$putfile = fopen("feeds/broken/lu-zz.csv", "rw");

我们正在使用:fputcsv($file, $array,';','"');来编写

并且最好:\n行结尾

简而言之:

来自:

array (size=3886)
  0 => 
    array (size=19)
      'brand' => string 'Tommy Hilfiger' (length=14)
      'category' => string '' (length=0)
      'category_path' => string 'Heren|Jeans|Blue jeans' (length=22)

  1 => 
    array (size=19)
      'brand' => string 'Marc Aurel' (length=10)
      'category' => string '' (length=0)
      'category_path' => string 'Dames|Jurken|Zomerjurken' (length=24)

  2 => 
    array (size=19)
      'brand' => string 'Rinascimento' (length=12)
      'category' => string '' (length=0)
      'category_path' => string 'Dames|Jurken|Print jurken' (length=25)

至此

"brand";"category";"category_path"
"Tommy Hilfiger";"";"Heren|Jeans|Blue jeans"  (/n)
"Marc Aurel";"";"Dames|Jurken|Zomerjurken"  (/n)
"Rinascimento";"";"Dames|Jurken|Print jurken"  (/n)

我们尝试的最后一段代码:

{ 
    foreach($subarray as $value){
        for ($i=0, $m=count($value); $i<$m; $i++){ 
          //$test = implode('";"',$subarray) ; 
          //$tmp = array();
          $result = call_user_func_array('array_merge', $subarray);
          //$tmp[]= array_merge($subsub[$i]);
          var_dump($result);
          fputcsv($putfile, $subarray,';','"'); 

        }

    } 
}  fclose($putfile);

这只是一遍又一遍地将相同的值返回到数组中:

foreach ($array as $subarray) { 
    foreach($subarray as $value){
        for ($i=0, $m=count($value); $i<$m; $i++){ 
          //$test = implode('";"',$subarray) ; 
          //$tmp = array();

          print_r($subarray);
          fputcsv($putfile, $subarray,';','"'); 

        }

    } 
}  fclose($putfile);

在我们的案例中解决方案:感谢&#34;不要恐慌&#34; &安培; &#34; CBroe&#34;

$putfile = fopen("feeds/stukkefeeds/lu-zz.csv", "wb");
$header = str_replace('"','',$header1);
$titel = explode(';',$header);
var_dump($titel);
// then write in your data
    fputcsv($putfile, $titel,';','"');
foreach ($array as $line) {
    fputcsv($putfile, $line,';','"'); 
}

2 个答案:

答案 0 :(得分:2)

看起来你可能会使它变得比它需要的更复杂。如果你有$array,那就是你所展示的那个:{/ p>

array (size=3886)
  0 => 
    array (size=19)
      'brand' => string 'Tommy Hilfiger' (length=14)
      'category' => string '' (length=0)
      'category_path' => string 'Heren|Jeans|Blue jeans' (length=22)
...

你有一个用

打开的工作文件句柄
$putfile = fopen("feeds/broken/lu-zz.csv", "w");

根本不需要嵌套循环。您可以在数组中的第一项(或任何项目)上使用array_keys来获取标题行,使用fputcsv将其写入文件,然后遍历数组并写入每一行数据,也包括fputcsv

$first_line = reset($array);                 // get the first line
fputcsv($putfile, array_keys($first_line));  // use its keys to write the headers

// then write in your data
foreach ($array as $line) {
    fputcsv($putfile, $line,';','"'); 
}

答案 1 :(得分:2)

看起来你觉得这里太复杂了......

$firstIteration = true;
foreach($yourArray as $elem) {
  if($firstIteration ) { // if this is the first array element,
                         // write out its keys to create the CSV heading line
    echo implode(';', array_keys($elem)) .'<br>';
    $firstIteration = false;
  }
  echo implode(';', $elem) .'<br>'; // output the data for each array element
}

(请注意,我在这里使用echo和implode用于演示目的;结果不会包含" - 切换用于将CSV再次写入文件应该没有问题。)