尝试使用filegetcsv以下代码解析CSV文件并对其进行处理,包括PHP函数定义页面:
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
print_r($data);
}
fclose($handle);
}
Run Code Online (Sandbox Code Playgroud)
但是代码在线上给了我一个无限循环的警告$data =:
PHP Warning: fgetcsv() expects parameter 1 to be resource, boolean given in...
Run Code Online (Sandbox Code Playgroud)
我知道文件不是太大或者格式不正确,因为我不断缩小原始文件以查看是否存在问题,最后只是在记事本中创建了一个自定义文件,其中只有两行:
Value1A,Value1B,Value1C,Value1D
仍然循环并且不提供数据.这是我正在使用的完整代码(使用一个大于行数的变量,所以我可以证明它会无限循环,而不会给我的服务器一个无限循环)
if ($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r') !== FALSE) {
while ((($data = fgetcsv($handle, 1000, ',')) !== FALSE) && ($row < 10)) {
print_r($data);
$row++;
}
fclose($handle);
}
Run Code Online (Sandbox Code Playgroud)
所以我真的有两个问题.
1)我可能忽略了什么导致这个循环?我半信半疑,这真的是"面对面"的简单......
2)如果文件存在但是存在一些未知问题,为什么推荐的此函数代码会导致无限循环?我本以为!== FALSE等等的目的就是防止那种东西.
毫无疑问,这里发生了什么:文件未成功打开.这就是为什么$handle是bool不是一种资源(var_dump($handle)以确认这个自己).
fgetcsv然后返回null(不是false!),因为有一个错误,并且你的测试没有选择它,因为你正在测试!== false.正如文件所述:
如果提供了无效句柄,则fgetcsv()返回NULL,对其他错误(包括文件末尾)返回FALSE.
我同意返回null和false不同的错误条件并不理想,而且它违背了许多其他功能所建立的先例,但这就是它的原因(事情可能 更糟).事实上,您可以简单地将测试更改为
while ($data = fgetcsv($handle, 1000, ","))
Run Code Online (Sandbox Code Playgroud)
它会在两种情况下都能正常工作.
更新:
您是if条件内的任务的受害者:
if ($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r') !== FALSE)
Run Code Online (Sandbox Code Playgroud)
本来应该
// wrap the assignment to $handle inside parens!
if (($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r')) !== FALSE)
Run Code Online (Sandbox Code Playgroud)
我相信你明白这里出了什么问题.这就是为什么我选择永远不会在条件内进行任务的原因.我不在乎这是可能的.我不在乎它更短.我甚至不关心有时候,如果取消分配,编写循环就不那么"优雅"了.如果你重视自己的理智,可以考虑做同样的事情.