我有这个代码来读取CSV文件。
$csv = array_map('str_getcsv', file($file));
var_dump($csv[0][0]).PHP_EOL;
...
echo $a['Type'];exit;
然而,当我尝试将第一行标题列用于数组数组的键时,我得到一个错误,因为第一列'Type'也包括BOM。BOM包含在文件内容中,然后包含在数组键中。看,它认为字符串'Type'是7个字符而不是4个字符,因为它包含了BOM <U+FEFF>
。
字符串(7)"类型"
PHP通知'yii'base' errorrexception '与消息'未定义的索引:类型'
file()
函数没有UTF选项。我如何使用file()
读取UTF文件?
我个人会避免使用file
,因为它会将整个文件读入内存。但是,假设您对此很熟悉,请手动过滤BOM:
$lines = file($file);
$lines[0] = preg_replace(sprintf('/^%s/', pack('H*','EFBBBF')), $lines[0]);
$csv = array_map('str_getcsv', $lines);
未经测试,这是我使用的替代方案:
$fp = fopen($file, 'r');
fseek($fp, 3);
while ($line = fgetcsv($fp)) {
$csv[] = $line;
}
fclose($fp);
如果BOM可能不存在,那么您需要增强此算法。