【问题标题】:php- extra comma appears while converting an array to csvphp-将数组转换为csv时出现额外的逗号
【发布时间】:2017-03-11 09:15:11
【问题描述】:

我有一个看起来有点像这样的数组

$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);
}

【问题讨论】:

    标签: php arrays csv


    【解决方案1】:

    如果您仍然要将内容写入文件,那么为什么不去掉中间人而只使用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')
    

    希望这会有所帮助!

    【讨论】:

    • 感谢@Ross Wilson
    【解决方案2】:

    执行以下操作(您的代码修改):-

    $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

    【讨论】:

    • @SajeevC 很高兴帮助你:):)
    • 谢谢! @活到死
    【解决方案3】:

    您可以做更多的函数式风格,并使用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 选项。

    至于为什么你自己的代码中有这么多逗号。首先,你两次内爆一些东西。其次,您在内爆之前添加了行尾符号,因此该符号也与逗号一起内爆。

    【讨论】:

    • 谢谢! @sevavietl
    猜你喜欢
    • 2013-03-26
    • 2019-12-10
    • 2018-01-10
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多