PHP-код для загрузки файла CSV не работает

У меня есть код ниже, где я генерирую случайные числа и пытаюсь загрузить их в виде файла CSV.

Если я попробую один фрагмент кода CSV в другом файле, он будет работать, но в этом коде он просто не будет работать. Я вижу случайные числа, но он не загружает файл CSV.

<?php

$dataarray=array();

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
$temp_memory = fopen('php://memory', 'w');
foreach ($input_array as $line)
{
fputcsv($temp_memory, $line, $delimiter);
}

fseek($temp_memory, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
fpassthru($temp_memory);
}

for ($i = 0; $i <= 25000; $i++)
{
$num = (rand(50,110));

array_push($dataarray,"$num");

echo "Hearbeat #" .$i . "\t\t ------   " . $num;
echo "<br>";
}

convert_to_csv($dataarray, 'data_as_csv.csv', ',');

?>

0

Решение

Вывод данных до отправка заголовков с header() Значит это header() звонки будут иметь нет эффект. Поэтому разумно ничего не отправлять перед заголовками.

В качестве другого ответа упоминается — второй аргумент fputcsv должен быть массив, поэтому я изменил вызов fputcsv тоже.

Если вы хотите, чтобы все значения были записаны в CSV-файл с запятой в качестве разделителя — передайте $input_array прямо к fputcsv,

Итак, ваш код может выглядеть так:

<?php
$dataarray=array();

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
$temp_memory = fopen('php://memory', 'w');

// Option 1 - every number will be on a new line
foreach ($input_array as $line)
{
// add `array($line)` not `$line`
fputcsv($temp_memory, array($line), $delimiter);
}

// Option 2 - all numbers will be in
// one line with `$delimiter` as separator
fputcsv($temp_memory, $input_array, $delimiter);

fseek($temp_memory, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
fpassthru($temp_memory);
}

for ($i = 0; $i <= 25000; $i++)
{
$num = (rand(50,110));
array_push($dataarray,"$num");

// this two lines are nor needed
//echo "Hearbeat #" .$i . "\t\t ------   " . $num;
//echo "<br>";
}

convert_to_csv($dataarray, 'data_as_csv.csv', ',');
1

Другие решения

На самом деле проблема в вашем convert_to_csv функция.
fputcsv ожидает, что второй параметр будет массивом, а в вашем случае — строкой. У вас есть 2 варианта в зависимости от того, что вы хотите:

1) Каждый номер в отдельной строке: просто измените fputcsv вызов функции для: fputcsv($temp_memory, [$line], $delimiter);

2) Все числа в одной строке разделены $delimiter:

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
$temp_memory = fopen('php://memory', 'w');

fputcsv($temp_memory, $fields, $delimiter);
fseek($temp_memory, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
fpassthru($temp_memory);
}

И (я уверен, что вы уже знаете), для загрузки файла автоматически, вы не должны echo что-нибудь.

0

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