为什么 fgetcsv() 函数将连续的 EMPTY 字段聚合为一个字段,并将其放入一个数组位置?

Why is fgetcsv() function aggregating the consecutive EMPTY fields into ONE field, and putting it into ONE array position?

这是 CSV 文件:

a.csv:

"a","b",,"c",,"d","e","f",,"g","h","i","j",,,,,,,,,,,,,,"k",,,,,,,,,,,,,,,"l","m,n","o"

现在在这个CSV文件中,,是字段之间的分隔符。所以第一个字段是a,第二个字段是b第三个字段是空的,第四个字段是c第五个字段再次为空,依此类推

这是我的示例代码:

index.php:

$file = fopen("a.csv", "r");

while ( !( ($line = fgetcsv($file, ',', '"')) === false ) ) {
    print_r($line);echo "<br>";
}

预期输出:

我原以为这段代码会打印出如下内容:

Array ( [0] => a, [1] => b [2] => [3] => c [4] => [5] => d ...so on

我得到的输出:

我得到的实际输出:

Array ( [0] => a, [1] => b [2] => ,, [3] => c [4] => ,, [5] => d [6] => , [7] => e [8] => , [9] => f [10] => ,, [11] => g [12] => , [13] => h [14] => , [15] => i [16] => , [17] => j [18] => ,,,,,,,,,,,,,, [19] => k [20] => ,,,,,,,,,,,,,,, [21] => l [22] => , [23] => m,n [24] => , [25] => o [26] => ) 

问题:

  1. 首先,为什么我得到那些 random 逗号? 我说 random因为可以看到,第一个元素a后面有逗号,那么第二个元素b后面没有逗号,c后面没有逗号要么(等等)。

  2. 对于没有值的字段,即为空的字段,为什么要聚合几个字段,例如在索引 18 处显示的字段中,大约 14 个 EMPTY 字段已聚合并放入一个数组位置。 为什么?结果是这个输出数组应该包含 43 个元素,现在包含 26 个。

如何解决这些问题并获得预期的输出?

注意:我可以更改 CSV 文件中的分隔符和字段包围值。

fgetcsv 的参数有误。 Note the second parameter, length,你错过了。事实上,因为您似乎只需要默认行为,所以这应该有效:

while ( !( ($line = fgetcsv($file)) === false ) ) {

您在原始代码中实际做的是将 CSV 行长度设置为“,”,将定界符设置为双引号,而不是设置围栏,这意味着它也默认为双引号。这显然混淆了解析器。

(顺便说一句,您可能还想在使用文件之前确保该文件存在,否则您的代码将进入无限循环,因为 fgetcsv returns NULL。)

我的问题是我的 PhpStorm 编辑器在 phpstorm 设置 Editor->general->Skip trailing spaces = none