【问题标题】:How do I create CSV file with PHP arrays?如何使用 PHP 数组创建 CSV 文件?
【发布时间】:2021-10-20 20:35:29
【问题描述】:

我阅读了官方的phpnet资源,但我不能。

我有 2 个数组。

第一个数组:

Array
(
    [0] => KDS-1655B
    [1] => KS-9916
    [2] => KDS-1197
    [3] => KDS-4164
    [4] => MRK-1994
    [5] => KDS-9773
) // LONG ARRAY, THIS IS EXAMPLE

第二个数组:

Array
(
    [0] => PRODUCTNAME1
    [1] => PRODUCTNAME2
    [2] => PRODUCTNAME3
    [3] => PRODUCTNAME4
    [4] => PRODUCTNAME5
    [5] => PRODUCTNAME6
) // LONG ARRAY, THIS IS EXAMPLE

现在,我想创建包含 2 个标题和 2 个列的 CSV 文件。 我试过这个:

$data = array(
    array($first_array, $second_array), // ARRAY CONTENTS
$filename = 'mycsv' . '.csv';
$delimiter = ',';

$f = fopen('php://memory', 'w');

$headings = array('firstheader', 'secondheader',); // HEADERS

fputcsv($f, $headings, $delimiter);

foreach($data as $row) {
    fputcsv($f, $row, $delimiter);
}


fseek($f, 0);

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '";');

fpassthru($f);

fclose($f);

exit();

但所有数组都在单个标题中生成。对于这个问题我能做些什么? 谢谢,问候。

【问题讨论】:

    标签: php csv


    【解决方案1】:

    出于解释的目的,我将数据简化为:

    $first_array:

    Array {
      [0]=> KDS-1655B
      [1]=> KS-9916
    }
    

    $second_array:

    Array {
      [0]=> PRODUCTNAME1
      [1]=> PRODUCTNAME2
    }
    

    你填写$data的方式不对,因为$data = array($first_array, $second_array);会给你:

    Array {
      [0]=> Array {
        [0]=> KDS-1655B
        [1]=> KS-9916
      }
      [1]=> Array {
        [0]=> PRODUCTNAME1
        [1]=> PRODUCTNAME2
      }
    }
    

    当你需要时:

    Array {
      [0]=> Array {
        [0]=> KDS-1655B
        [1]=> PRODUCTNAME1
      }
      [1]=> Array {
        [0]=> KS-9916
        [1]=> PRODUCTNAME2
      }
    }
    

    如果我没记错的话,PHP 没有提供任何函数来生成这种连接,你必须自己编写代码,例如这样:

    $data = array();
    $size = count($first_array);
    for ($i = 0; $i < $size; $i++) {
        $data[] = array( $first_array[$i], $second_array[$i] );
    }
    

    你就完成了。生成的 CSV 将类似于:

    KDS-1655B,PRODUCTNAME1
    KS-9916,PRODUCTNAME2
    

    您的固定代码

    $filename = 'mycsv' . '.csv';
    $delimiter = ',';
    $data = array();
    $size = count($first_array);
    for ($i = 0; $i < $size; $i++) {
        $data[] = [ $first_array[$i], $second_array[$i] ];
    }
    
    $f = fopen('php://memory', 'w');
    
    $headings = array('firstheader', 'secondheader'); // HEADERS
    
    fputcsv($f, $heading, $delimiter);
    
    foreach($data as $row) {
        fputcsv($f, $row, $delimiter);
    }
    fseek($f, 0);
    
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="' . $filename . '";');
    
    fpassthru($f);
    fclose($f);
    exit();
    

    另一个代码

    $csv_filename = 'mycsv.csv';
    $csv_header = array('firstheader', 'secondheader');
    
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="' . $csv_filename . '";');
    
    $fp = fopen('php://memory', 'w');
    
    fputcsv($fp, $csv_header);
    
    $size = count($first_array);
    for ($i = 0; $i < $size; $i++) {
        fputcsv($fp, [ $first_array[$i], $second_array[$i] ]);
    }
    
    fseek($fp, 0);
    fpassthru($fp);
    
    fclose($fp);
    
    exit();
    

    【讨论】:

    • 谢谢,但我从 API 调用这个数组。实际上,至少有 300 个值。
    • 这只是一个基于您问题中的数据和代码的示例。我要评论它
    • 谢谢,你是对的。我编辑了我的帖子。
    • 你也可以在一个循环中完成。为 fputcsv 之前的行构建数组,您不需要中间的 data 数组
    • for ($i = 0; $i &lt; $size; $i++) {fputcsv($f, [ $first_array[$i], $second_array[$i] ], $delimiter);}
    猜你喜欢
    • 2010-11-19
    • 2017-01-20
    • 2016-12-06
    • 1970-01-01
    • 2010-12-13
    • 2013-03-08
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多