Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下载CSV文件的PHP代码不起作用_Php_Csv - Fatal编程技术网

下载CSV文件的PHP代码不起作用

下载CSV文件的PHP代码不起作用,php,csv,Php,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, $delimit

我有下面的代码,在这里我生成随机数并尝试将它们作为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', ',');

?>
如果我在另一个文件上单独尝试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', ',');

?>

事实上,问题出在您的
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);
        }

而且(我相信您已经知道),要自动下载文件,您必须在发送带有
header()
的头文件之前
echo
任何内容。

输出数据,这意味着
header()
调用将产生效果。因此,在邮件头之前不发送任何内容是合理的

正如前面提到的另一个答案,
fputcsv
的第二个参数必须是array,因此我也将调用更改为
fputcsv

如果要将所有值以逗号作为分隔符写入csv文件,请将
$input\u 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', ',');

严重-您将所有值从一个数组
$input\u数组
放到另一个数组
$fields
?为什么?非常感谢。1-我希望这些值出现在屏幕上,所以我需要一些回音,但是如果把它放在屏幕上,就会停止文件的下载这些值在生成的文件中不以逗号分隔。您必须了解只有一个选项-下载文件或查看网页。在php中,这两种方法都无法实现。如果您需要用逗号分隔的值,那么正如@gmc所说的,将
$input\u array
传递到
fputcsv