CodeIgniter 4 CSV导入数组首键Undefined报错求助
解决CSV导入时带BOM头的数组键名不匹配问题
你的问题根源是CSV文件的表头第一个字段带有UTF-8 BOM(\ufeff),导致数组键名实际是\ufeffVozac而非Vozac——print_r会自动隐藏这个不可见字符,所以看起来键名存在,但直接用字符串访问就会报错。下面给你两种实用的解决办法:
方法一:读取CSV时提前去除BOM头
在读取CSV文件内容的阶段就处理掉BOM,避免后续数组键名异常:
$filePath = '你的CSV文件路径'; // 读取文件内容并去除BOM $content = file_get_contents($filePath); $content = preg_replace('/^\x{FEFF}/u', '', $content); // 按行拆分CSV内容(根据你的分隔符调整) $rows = str_getcsv($content, "\n"); // 后续正常处理每行数据即可
如果用fopen逐行读取:
$handle = fopen($filePath, 'r'); // 读取前3字节判断是否存在UTF-8 BOM $bom = fread($handle, 3); if ($bom !== "\xef\xbb\xbf") { // 没有BOM则将文件指针移回开头 rewind($handle); } // 正常读取CSV内容 while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { // 处理每行数据 } fclose($handle);
方法二:清理已生成数组的键名
如果已经得到了带BOM的数组$boltReportTrimed,可以遍历数组清理键名:
$cleanedData = []; foreach ($boltReportTrimed as $key => $value) { // 移除键名开头的BOM字符 $cleanKey = preg_replace('/^\x{FEFF}/u', '', $key); $cleanedData[$cleanKey] = $value; } // 之后就可以正常访问$cleanedData['Vozac']了
在CodeIgniter 4框架中,不管你是用上传类获取文件,还是直接读取服务器文件,都可以把上述BOM处理步骤插入到读取文件内容之后、解析CSV之前的环节。
内容的提问来源于stack exchange,提问作者Damodar
相关产品推荐
相关产品推荐

