【问题标题】:From CSV to array with headerkeys, now back to CSV从 CSV 到带有 headerkeys 的数组,现在回到 CSV
【发布时间】:2016-12-17 12:06:13
【问题描述】:

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

在广泛搜索将multidimensional array (with named keys) 恢复到其 CSV 文件的方法后提出了这个问题。您可能会说:“但这在 SO 的多个页面上都有介绍,请搜索更好!”但我们做到了,我们发现我们试图屈从于我们的意志的结果,但失败了。

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

所以现在我们回来询问 SO:

我们已将 CSV 读入一个多维数组,使用标题的第一行作为键名。

然后我们使用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);

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

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

【问题讨论】:

  • 尝试在 SO 中搜索 convert json to csv - 结果会更符合您的喜好
  • 你已经展示了你的开始,以及你想要达到的目标,这很好,但我认为包含一个显示您当前正在使用的代码,没有任何故事,并简要说明不是您想要的。
  • 这些结果将如何帮助我,我需要寻找哪些结果才能应用于 php,以及 JSON 如何工作,因为我不要求 JSON 解决方案。这是我们在 SO 上没有发现的问题,我们现在已经处理了 2 个晚上,我们找到的解决方案不能满足我们需要它做的事情......
  • 关于您的编辑,我的评论不是为了解释您的反对意见(不是我的)。只是想提供帮助。
  • 感谢您的提问,我添加了我们尝试过的最后一个 foreach,但由于我们尝试了这么多,很难回忆所有选项是什么。当我们正在寻找解决类似问题的其他解决方案时,这些解决方案既没有像我们那样的尺寸,也没有键编号。这些解决方案很短,所以看起来像 foreach 中的 foreach 可能会奏效。一旦我回忆起它,我们就认为我们有另一个紧密的解决方案。

标签: php csv multidimensional-array flatten fputcsv


【解决方案1】:

看起来你可能让它变得比它需要的更复杂。如果您有一个$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 来获取标题行,使用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,';','"'); 
}

【讨论】:

  • 哈,同时也在想同样的事情:)
  • 嗯,我也是这么想的。 :)
  • 成功了。我已将 fopen 更改为以“wb”而不是“rw”结尾,这解决了 1kb 文件大小。在header 上添加了一个爆炸以使其成为一个数组。并写下您可以在上面的解决方案中阅读的其余部分。谢谢两位帮忙!生病标记不要恐慌的答案。
【解决方案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 写入文件应该没有问题。)

【讨论】:

  • 嗯,复杂的思维是我生活中的一件事......也就是说,我很欣慰,还有像你这样的人,不要恐慌,他们不是过分热切的反对者,而且仍然存在帮助新的编码人员到现场。关于给出的答案:“我看到你在面对我的思考过程时做了什么”,我会试一试。生病回来这里报告。