Из CSV в массив с заголовочными ключами, теперь обратно в CSV

Наша история: (короткая версия ниже, если вы хотите устранить неполадки)

Этот вопрос задается после тщательного поиска способа получить multidimensional array (with named keys) обратно в файл CSV. Вы можете сказать: "Но это описано на нескольких страницах на SO, ищите лучше!" но мы сделали, и результаты, которые мы нашли, мы пытались подчиниться нашей воле, но не смогли.

Во-первых, причиной этого было удаление столбцов из CSV, которые мешали остальной части нашего запроса и кода.

Итак, теперь мы вернулись, чтобы спросить о SO:

Мы прочитали CSV в многомерный массив, используя 1-ю строку заголовков в качестве имен ключей.

Затем мы использовали 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);

Решение в нашем случае: благодаря "Не паникуй" и "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,';','"'); 
}

2 ответа

Решение

Похоже, что вы можете сделать это более сложным, чем нужно. Если у вас есть $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,';','"'); 
}

Похоже, вы думаете, что здесь слишком сложно...

$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 в файл снова не должно быть проблемой.)

Другие вопросы по тегам