将数组转换为csv

时间:2017-03-11 09:15:12

标签: php arrays csv

我有一个看起来像这个

的数组
$cars = array
  (
  array("Name","Price","Hours"),
  array("AMW",15,13),
  array("Saab",5,2),
  array("Cand Rover",17,15)
  );

我正在尝试将此数组转换为CSV数据,以便我可以将其写入文件。

我有一个函数,它将数组作为输入并将其转换为CSV格式。它看起来像这样:

function array_2_csv($array) 
{
     $csv = array();
     foreach ($array as $item) 
     {
         if (is_array($item)) 
         {
             $csv[] = array_2_csv($item);
             $csv[]="\r\n";
         } 
         else 
         {
             $csv[] = $item;
         }
     }
     return implode(',', $csv);
}

它有效,但在线条前面会出现一个额外的逗号。我该如何删除?

预期输出

Name,Price,Hours
AMW,15,13,
Saab,5,2,
Cand Rover,17,15

我得到的输出是

Name,Price,Hours,
,AMW,15,13,
,Saab,5,2,
,Cand Rover,17,15,

完整代码

$cars = array
  (
  array("Name","Price","Hours"),
  array("AMW",15,13),
  array("Saab",5,2),
  array("Cand Rover",17,15)
  );
$csv_data = array_2_csv($cars);

echo $csv_data;
function array_2_csv($array) 
{
     $csv = array();
     foreach ($array as $item) 
     {
         if (is_array($item)) 
         {
             $csv[] = array_2_csv($item);
             $csv[]="\r\n";
         } 
         else 
         {
             $csv[] = $item;
         }
     }
     return implode(',', $csv);
}

3 个答案:

答案 0 :(得分:2)

如果您要将内容写入文件,那么为什么不切断中间人并使用fputcsv()

这样你的功能看起来像是:

function array_2_csv($array, $fileName)
{
    $file = fopen($fileName, 'w');

    foreach ($array as $fields) {
        fputcsv($file, $fields);
    }

    fclose($file);
}

然后你的电话会是这样的:

array_2_csv($cars, 'path-to-file')

希望这有帮助!

答案 1 :(得分:1)

如下所示(代码修改): -

$csv_data = array_2_csv($cars);

echo $csv_data;
function array_2_csv($array) 
{
     $csv = ''; //take string
     foreach ($array as $item) 
     {
         if (is_array($item)) 
         {
             $csv .= implode(',',$item); // implode and add to string
             $csv .="\r\n"; // add new line
         }else{
           $csv .= $item; // direct add value to string
           $csv .="\r\n"; //add new line
         } 

     }
     return $csv; //return string
}

输出: - https://eval.in/752820

答案 2 :(得分:1)

您可以执行更多功能样式并使用array_map以及几个implode函数:

function array_2_csv(array $array, $delimiter = ',') 
{
    return implode('', array_map(function ($item) use ($delimiter) {
        return implode($delimiter, $item) . PHP_EOL;
    }, $array));
}

这是working demo

但如果您只想将结果写入文件,那么@RossWilson answer会更好。由于fputcsv可以正确转义引号,也可以使用$delimeter选项和$escape_char选项。

至于为什么你在自己的代码中得到这么多逗号。首先,你将一些东西摧毁了两次。其次,你是在爆炸之前添加行尾符号,所以符号也会被逗号破坏。