从 CSV 到带有 headerkeys 的数组,现在又回到 CSV

From CSV to array with headerkeys, now back to CSV

我们的故事:(如果您急于解决问题,请查看下面的简短版本)

在广泛搜索将 multidimensional array (with named keys) 返回其 CSV 文件的方法后,提出了这个问题。你可能会说:"But this is covered on multiple pages on SO, search better!"但我们做到了,我们发现的结果我们试图屈服于我们的意志,但失败了。

这样做的首要原因是从 CSV 中删除干扰我们其余查询和代码的列。

所以现在我们回来问 SO:

我们已经将 CSV 文件读入多维数组,使用 headers' 第一行作为键名。

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

我们还 str_replace'd 来自 $header 变量的那些列名称。

所以我们正在广泛读取 csv,将它们放入具有数字第一索引和以我们的 CSV 文件的第一行命名的第二维度键的很棒的数组中。

我们还将 CSV 文件中的原始 Header 存储在一个名为 $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);

这只是把相同的值returns一遍又一遍地放入一个数组中:

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

我们案例中的解决方案:感谢"Don't Panic" & "CBroe"。

$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,';','"'); 
}

看起来您可能使它变得比需要的更复杂。如果你有一个 $array 就是你展示的那个看起来像:

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 来获取 header 行,使用 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,';','"'); 
}

看来你想的太复杂了...

$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 写入文件应该没有问题。)