1

I have an array which looks somewhat like this

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

And I'm trying to convert this array to CSV data so that I can write it into a file.

I have a function which takes an array as input and converts it into CSV format. It looks like this:

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

It works but an extra comma appears on front of lines. How can I remove that?

Expected Output

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

Output I'm getting is:

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

Full Code

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

3 Answers 3

2

If you're going to be writing the contents to a file anyway then why not cut out the middleman and just use fputcsv().

This way you function would look something like:

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

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

    fclose($file);
}

Then your call would be something like:

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

Hope this helps!

Sign up to request clarification or add additional context in comments.

Comments

1

Do like below (your code modification):-

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

Output:-https://eval.in/752820

Comments

1

You can do more functional style and use array_map along with couple of implode functions:

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

Here is working demo.

But if you want just write the results to file then @RossWilson answer is better. As fputcsv can properly escape quotes and also can take the $delimeter option and $escape_char option.

And as for why you are getting so many commas in your own code. Firstly, you implode some things twice. Secondly, you are adding the end of line symbol before imploding, so the symbol gets implode with the comma too.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.