最直接可靠的方法是使用str_getcsv()函数,它能正确处理分隔符、引号和转义字符,适用于解析内存中的CSV字符串。

在PHP中,将CSV格式的字符串转换成数组,最直接、最可靠的方法就是使用内置的
str_getcsv()
PHP提供了一个非常方便的内置函数
str_getcsv()
str_getcsv(string $input, string $delimiter = ',', string $enclosure = '"', string $escape = '\')
让我们看几个例子,从最简单的到稍微复杂一点的。
基本用法:
立即学习“PHP免费学习笔记(深入)”;
<?php $csvString = "Apple,Banana,Orange"; $dataArray = str_getcsv($csvString); print_r($dataArray); // 输出: Array ( [0] => Apple [1] => Banana [2] => Orange ) ?>
自定义分隔符:
如果你的CSV字符串不是以逗号分隔,比如用分号,你可以这样指定:
<?php $csvString = "ID;Name;Email"; $dataArray = str_getcsv($csvString, ';'); print_r($dataArray); // 输出: Array ( [0] => ID [1] => Name [2] => Email ) ?>
处理包含分隔符的数据(引用符):
CSV标准允许使用引号(通常是双引号)来包围包含分隔符的字段。
str_getcsv()
<?php $csvString = '"Product A","Description, with a comma","Price $10.99"'; $dataArray = str_getcsv($csvString); print_r($dataArray); // 输出: Array ( [0] => Product A [1] => Description, with a comma [2] => Price $10.99 ) ?>
这里,
"Description, with a comma"
处理引用符本身:
如果一个字段中需要包含引用符,通常的做法是将其重复一次(即
""
str_getcsv()
""
<?php $csvString = '"Field with ""quotes"" inside",Another Field'; $dataArray = str_getcsv($csvString); print_r($dataArray); // 输出: Array ( [0] => Field with "quotes" inside [1] => Another Field ) ?>
如果你的CSV使用了反斜杠
<?php $csvString = 'Field with "quotes" inside,Another Field'; $dataArray = str_getcsv($csvString, ',', '"', '\'); print_r($dataArray); // 输出: Array ( [0] => Field with "quotes" inside [1] => Another Field ) ?>
不过,通常情况下,CSV标准更倾向于双引号转义双引号的方式。
在PHP中处理CSV数据,我们确实有几种不同的方法,但它们各自有其适用场景和优缺点。理解
str_getcsv
explode
fgetcsv
首先说
explode
explode()
"Hello, World"
explode
explode
<?php
$csvString = "Apple,Banana,"Orange, Sweet"";
$explodedArray = explode(',', $csvString);
print_r($explodedArray);
// 输出: Array ( [0] => Apple [1] => Banana [2] => "Orange [3] => Sweet" ) - 明显错误
?>接下来是
fgetcsv
fgetcsv()
fopen()
str_getcsv()
fgetcsv
fgetcsv
str_getcsv
<?php
// 假设有一个名为 'data.csv' 的文件,内容是:
// Apple,Banana,"Orange, Sweet"
// Carrot,Potato,"Tomato, Red"
// $handle = fopen('data.csv', 'r');
// if ($handle) {
// while (($data = fgetcsv($handle)) !== FALSE) {
// print_r($data);
// }
// fclose($handle);
// }
// 输出:
// Array ( [0] => Apple [1] => Banana [2] => Orange, Sweet )
// Array ( [0] => Carrot [1] => Potato [2] => Tomato, Red )
?>(这里因为我们是生成文章,无法直接执行文件操作,所以用注释表示其用法和预期输出。)
最后是
str_getcsv
str_getcsv()
fgetcsv
str_getcsv
总结来说:
explode
fgetcsv
str_getcsv
选择哪个函数,完全取决于你的数据来源和具体需求。如果你有一个CSV文件,用
fgetcsv
str_getcsv
explode
在实际应用中,CSV数据远不止“逗号分隔”那么简单,我们经常会遇到各种“奇葩”情况,比如字段内包含逗号、双引号,或者出现空值,甚至整行都是空的。
str_getcsv()
1. 字段内包含逗号或双引号: 这是CSV标准的核心问题之一。当一个字段本身包含分隔符(如逗号)或引用符(如双引号)时,该字段必须用双引号包围起来。如果字段内本身有双引号,则该双引号需要被“转义”,通常的做法是将其重复一次(即
""
str_getcsv()
<?php $complexCsv = '"Item A","Description with a comma, and ""quotes"" inside",123'; $data = str_getcsv($complexCsv); print_r($data); // 输出: Array ( [0] => Item A [1] => Description with a comma, and "quotes" inside [2] => 123 ) ?>
可以看到,
"Description with a comma, and ""quotes"" inside"
Description with a comma, and "quotes" inside
str_getcsv()
enclosure
"
escape
"
escape
2. 处理空值或缺失字段: CSV中空值通常表现为两个分隔符之间没有任何内容,或者一个被引号包围的空字符串
""
str_getcsv()
<?php $csvWithEmpty = "Value1,,Value3,"""; $data = str_getcsv($csvWithEmpty); print_r($data); // 输出: Array ( [0] => Value1 [1] => [2] => Value3 [3] => ) ?>
这里,第二个字段
,,
""
null
3. 处理整行空行: 如果你的CSV字符串包含一个完全空白的行(例如,只有换行符),
str_getcsv()
false
<?php
$multiLineCsv = "Header1,Header2
Value1,Value2
Value3,Value4";
$lines = explode("
", $multiLineCsv);
foreach ($lines as $line) {
if (trim($line) === '') { // 检查是否是空行
echo "Skipping empty line.
";
continue;
}
$data = str_getcsv($line);
print_r($data);
}
// 输出:
// Array ( [0] => Header1 [1] => Header2 )
// Array ( [0] => Value1 [1] => Value2 )
// Skipping empty line.
// Array ( [0] => Value3 [1] => Value4 )
?>这里我用
explode("
", $multiLineCsv)str_getcsv
trim($line) === ''
4. 字符编码问题: 虽然
str_getcsv()
str_getcsv()
iconv()
mb_convert_encoding()
<?php
// 假设 $gbkCsvString 是GBK编码的CSV字符串
// $utf8CsvString = iconv('GBK', 'UTF-8//IGNORE', $gbkCsvString);
// $data = str_getcsv($utf8CsvString);
// print_r($data);
?>//IGNORE
处理复杂CSV字符串的关键在于理解CSV的格式规范,以及
str_getcsv()
delimiter
enclosure
escape
在使用
str_getcsv()
性能考量:
str_getcsv()
memory_limit
str_getcsv()
str_getcsv()
explode("
", $csvString)str_getcsv()
explode
何时 str_getcsv()
str_getcsv()
str_getcsv()
str_getcsv()
替代方案:
当
str_getcsv()
fgetcsv()
fgetcsv()
fgetcsv()
<?php
// 假设 'large_data.csv' 是一个非常大的CSV文件
// $handle = fopen('large_data.csv', 'r');
// if ($handle) {
// while (($data = fgetcsv($handle)) !== FALSE) {
// // 处理每一行数据,例如:
// // print_r($data);
// // database_insert($data);
// }
// fclose($handle);
// } else {
// echo "无法打开文件!";
// }
?>如果你有一个非常大的CSV字符串,但又不能直接保存到文件,你可以考虑使用
php://memory
php://temp
fgetcsv()
fgetcsv()
<?php
$largeCsvString = "Header1,Header2
" . str_repeat("ValueA,ValueB
", 100000); // 模拟一个大字符串
$stream = fopen('php://temp', 'r+'); // 使用php://temp,当数据量大时会写入临时文件
fwrite($stream, $largeCsvString);
rewind($stream); // 将文件指针重置到开头
$parsedData = [];
while (($row = fgetcsv($stream)) !== FALSE) {
$parsedData[] = $row;
// 如果数据量巨大,不要将所有行都存入 $parsedData,而是逐行处理或写入数据库
}
fclose($stream);
// print_r($parsedData); // 此时 $parsedData 可能仍然很大,取决于原始字符串大小
?>这种
php://temp
str_getcsv
手动解析(不推荐,除非有特殊需求): 在极少数情况下,如果
str_getcsv()
fgetcsv()
总结来说,对于CSV字符串到数组的转换,
str_getcsv()
fgetcsv()
php://temp
以上就是PHP中如何将CSV字符串转为数组?str_getcsv函数使用方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号