Наша история: (короткая версия ниже, если вы хотите устранить неполадки)
Этот вопрос задается после тщательного поиска способа получить 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,';','"');
}
Похоже, что вы можете сделать это более сложным, чем нужно. Если у вас есть $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 в файл снова не должно быть проблемой.)