Из 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,';','"');
}
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 в файл снова не должно быть проблемой.)

2

По вопросам рекламы [email protected]