str_getcsv示例

8

我想将逗号分隔的字符串解析成数组。我想尝试使用 str_getcsv() php 函数,但我找不到任何好的示例来说明如何使用它。

例如,我有一个输入框,用户可以在其中提交编程语言的标签(php、js、jquery 等),就像在 stackoverflow 提交问题时的“tags”输入框一样。

如何使用 str_getcsv 将类似 value="php, js, jquery" 的输入转换为数组呢?


1
为什么不只使用explode函数? - heximal
2
也许我误解了你的意思,但 $myArray = str_getcsv($value); 应该可以吧? - Jürgen Thelen
1
@heximal:这样做有什么优势? - mario
@heximal,我认为str_getcsv对于我的情况更加理想,因为它是用于CSV的。 - CyberJunkie
1
@heximal:explode函数不会考虑括号内包含逗号的文本。 - Luke
5个回答

9

确实,http://us3.php.net/manual/zh/function.str-getcsv.php 上的规范并没有包含一个标准的示例,但用户提交的注释已经很好地涵盖了它。如果这是一个表单输入:

$val = $_POST['value'];
$data = str_getcsv($val);

$data现在是一个包含值的数组。尝试使用它并查看是否还有其他问题。


9
我认为你可以考虑使用 explode 来完成这个任务。
 $values  = "php, js, jquery";
 $items = explode(",", $values);

 // Would give you an array:
 echo $items[0];  // would be php
 echo $items[1];  // would be js
 echo $items[2];  // would be jquery

这可能比str_getcsv()更有效率;请注意,您需要使用trim()来删除项目值之前和之后的可能空格。
更新:我之前没有看到过str_getcsv,但是在manpage上阅读了这句话,似乎它是一个值得考虑的选择:
为什么不使用explode()而不是str_getcsv()来解析行? 因为explode()不能正确处理字符串中可能存在的封闭部分或转义字符。

1
感谢+1的例子。Explode是一个很好的函数,但str_getcsv似乎会自动修剪空白。我在这两者之间进退维谷。 - CyberJunkie

3

为了简单和易读性,我通常只使用explode()函数,只有在以下两种情况下才会加入str_getcsv()函数:1)主要分隔符也在数据本身中使用;2)我尝试用作主分隔符的标记被其他不同的字符包围。

例如,一个CSV文件的基本解析器:

$filename = $argv[1];
if (empty($filename)) { echo "Input file required\n"; exit; }
$AccountsArray = explode("\n", file_get_contents($filename));

只要 $AccountsArray 中的每个元素本身没有包含逗号,这段代码就能完美地运行,并且非常简单易懂:
foreach ($AccountsArray as $entry) {
    $acctArr = explode(",", $entry);
}

然而,数据通常会包含分隔符,此时必须存在一个封闭标记(例如本例中的“"”)。如果是这样,那么我会使用以下代码切换到str_getcsv():

foreach ($AccountsArray as $entry) {
    $acctArr = str_getcsv($entry, ",", "\""); 
}

谢谢你的分享!从文件中获取数据确实很好。 - CyberJunkie
我认为这应该是被接受的答案。它很清晰地展示了如何使用str_getcsv()代替我之前使用的explode()函数。 - Brent Connor

0

代码非常简单,使用Str_getcsv函数,我们将遍历CSV文件“images.csv”的每一行,该文件位于与我们的脚本相同的目录中。

注意:所使用的函数兼容PHP版本>= 5.3.0

//First, reading the CSV file

$csvFile = file('file.csv');

foreach ($csvFile as $line) {
    $url = str_getcsv($line);

    $ch = curl_init($url[0]);

    $name = basename($url[0]);

    if (!file_exists('directory/' . $name)) {
        $fp = fopen('directory/' . $name, 'wb');
    }

    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);         
}

0
//get the csv
$csvFile = file_get_contents('test.csv');
//separate each line
$csv = explode("\n",$csvFile);

foreach ($csv as $csvLine) {

    //separet each fields
    $linkToInsert = explode(",",$csvLine);
    //echo what you need
    //$linkToInsert[0] would be the first field, $linkToInsert[1] second field, etc
    echo '• ' . $linkToInsert[1] . '<br>';
}

这通常不起作用。如果一个字段包含换行符或逗号怎么办? - Christian Lescuyer
在这种情况下,我认为您可以在explode之前使用str_replace“过滤”或删除换行符和任何其他不需要的内容。 - user2986055
"字段1","字段2","带逗号的字段3","字段4" 您会删除字段3中的逗号吗?如何处理?或许逗号存在是有原因的? - Christian Lescuyer
在这种情况下,它取决于csv文件的创建方式。通常,当我创建一个csv文件时,我会选择一个字段分隔符,比如 " -> 这样它就会给出 "field 1","field 2" 等等... 如果不是一个csv文件,为什么要使用 str_getcsv() 函数呢? - user2986055
CSV 是指“逗号分隔值”,很多应用程序都可以读取或写入这种格式。对于某些用途来说,WIWSV(“任何我想要的值分隔符”)是完全可以的,但是你无法使用 Excel 等工具读取或写入它。 - Christian Lescuyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接