Learning never exhausts the mind

Last Updated by

How to import CSV file into a PHP array using PHP's fgetcsv function. The array is associative so you can access values by the column heading from the CSV.

This PHP function will import CSV and convert it to an associative array based on the column headings in the first row. To use, simply call the function with a valid filename as the only parameter. The function will return an associative array of the import CSV file contents.

The import CSV must have column headings as the first row since these are used to create the associative array elements.

Import CSV to Array with PHP

<?php

function ImportCSV2Array($filename)
{
    $row = 0;
    $col = 0;
    
    $handle = @fopen($filename, "r");
    if ($handle) 
    {
        while (($row = fgetcsv($handle, 4096)) !== false) 
        {
            if (empty($fields)) 
            {
                $fields = $row;
                continue;
            }
            
            foreach ($row as $k=>$value) 
            {
                $results[$col][$fields[$k]] = $value;
            }
            $col++;
            unset($row);
        }
        if (!feof($handle)) 
        {
            echo "Error: unexpected fgets() failn";
        }
        fclose($handle);
    }
    
    return $results;
}

Example usage

<?php

$filename = "test.csv";
$csvArray = ImportCSV2Array($filename)

foreach ($csvArray as $row)
{
    echo $row['column1'];
    echo $row['column2'];
    echo $row['column3'];
}

What is happening?

This function takes each line of the CSV import file and runs it through PHP's fgetcsv function. This function is similar to fgets except that fgetcsv parses the line it reads for fields in CSV format and returns an array containing the fields read. The array is an indexed array, with the first item at 0, second at 1 and so on.

To get the associative array, the first row of data is used as the column headings, then a loop runs over each item in the array from fgetcsv and inserts it against the column heading.

The method of using associative arrays is far better than an indexed array, as it can often be confusing, cause errors trying to remember what piece of data is at any given numerical index, and code maintenance is often a minefield. If a new column is added to the data, you have to update all the indexes where that array is used. With an associative array, you access data via a name, so it does not matter what order the data is read in or how many columns are inserted, that name will remain constant.

4 thoughts on “PHP Function to Import CSV to an Array
  • Gary
    26th February 2016 at 12:00 am

    Hi, great function! How would you start reading at say the 300th row? I'm trying to work this out but am not an expert in PHP, can it be done within your function? Thanks in advance!

    Reply
    • Tim Trott
      27th February 2016 at 12:00 am

      Just a quick idea, you could check the counter before processing the row. Something similar to this should work:

      while (($row = fgetcsv($handle, 4096)) !== false)
      {
      if (empty($fields))
      {
      $fields = $row;
      continue;
      }

      // start at row 300. $col is 0 indexed
      if ($col > 299)
      {
      foreach ($row as $k=>$value)
      {
      $results[$col][$fields[$k]] = $value;
      }
      }

      $col++;
      unset($row);
      }

      Reply
  • 6th February 2015 at 12:00 am

    Many thanks, you saved the day.

    Reply
  • Steve
    4th November 2014 at 12:00 am

    Thanks Tim, used it today, works great!

    Reply

Leave a Reply

Fields marked with * are mandatory.

We respect your privacy, and will not make your email public. Hashed email address may be checked against Gravatar service to retrieve avatars. This site uses Akismet to reduce spam. Learn how your comment data is processed.