How to parse CSV files into PHP arrays
Read a CSV file and convert it into a usable PHP array structure using the built-in fgetcsv function. This guide covers basic reading, header handling, and error management for production code.
You will learn how to read a CSV file and convert it into a PHP array using the built-in fgetcsv function. This guide targets PHP 8.3.x running on Linux systems and covers basic reading, header management, and error handling. You will apply these steps to process real data files without external libraries.
Prerequisites
- Operating system: Ubuntu 24.04, Debian 12, or AlmaLinux 9
- PHP version: 8.3.x installed and running
- A CSV file located in a writable directory (e.g., /var/www/html/data)
- Basic knowledge of PHP syntax and file paths
Step 1: Create a sample CSV file
Create a CSV file to test your parsing logic. Use a simple format with a header row and a few data rows. This ensures you have a valid file to read before writing the PHP script.
cat > /var/www/html/data/users.csv /var/www/html/data/parse_csv.php
EOF
Run the updated script:
php /var/www/html/data/parse_csv_assoc.php
You will see the following output:
Alice Smith is a admin.
Bob Jones is a user.
Charlie Brown is a user.
Step 4: Handle CSV errors gracefully
Add error handling to catch malformed rows or encoding issues. Use fgetcsv return values to detect bad data and log errors instead of crashing the script.
cat > /var/www/html/data/parse_csv_safe.php
EOF
Run the safe parser:
php /var/www/html/data/parse_csv_safe.php
You will see output like this:
Successfully parsed 3 rows.
Verify the installation
Ensure PHP and the CSV parsing functions are available. Run a quick check to confirm fgetcsv is accessible in your environment.
php -r "echo function_exists('fgetcsv') ? 'fgetcsv is available' : 'fgetcsv is missing';"
You will see:
fgetcsv is available
Troubleshooting
If fgetcsv returns false unexpectedly, check for encoding issues or BOM markers. Use iconv or mb_convert_encoding to normalize file content before parsing.
cat > /var/www/html/data/parse_csv_bom.php