无法访问stdClass对象的id属性问题求助
问题根源与解决方案
你的问题是CSV文件表头带有UTF-8字节顺序标记(BOM),导致生成的stdClass对象中,id属性名实际包含不可见的BOM字符,而非单纯的"id"。从var_dump的输出能看到,id属性名被引号包裹的部分是"id",那个看不见的前缀就是BOM。
验证问题
可以通过打印属性名的十六进制值确认:
foreach($layout->items[1] as $key => $val) { echo $key . ' -> ' . bin2hex($key) . "\n"; }
输出中id对应的十六进制会以efbbbf开头(这是UTF-8 BOM的字节),而正常属性名比如fet只会是666574。
解决办法
方案1:读取文件时移除BOM
修改CSV读取逻辑,先去掉文件开头的BOM:
case($_FILES['csv_upload'] != NULL); $data = []; // 读取文件内容并移除UTF-8 BOM $fileContent = file_get_contents($_FILES['csv_upload']['tmp_name']); $fileContent = preg_replace('/^\x{EF}\x{BB}\x{BF}/u', '', $fileContent); // 按行分割并解析CSV $csv = array_map('str_getcsv', explode("\n", trim($fileContent))); $header = array_map('strtolower' , $csv[0]); foreach($csv as $row) { $row = preg_replace("/[\$,]/", "", $row ); $data[] = array_combine($header, $row); } $layout->items = json_decode(json_encode($data), FALSE); unset($layout->items[0]);
方案2:清理表头中的不可见字符
如果不确定文件是否带BOM,可以直接在处理表头时过滤所有不可见控制字符:
$header = array_map(function($h) { // 移除所有不可见字符(包括BOM、空格等)并转小写 return strtolower(preg_replace('/[\x00-\x1F\x7F]/u', '', trim($h))); }, $csv[0]);
原理说明
UTF-8编码的文件有时会在开头添加3个字节的BOM(EF BB BF),用于标记文件编码。当用file()函数读取时,这3个字节会被包含在第一行的第一个元素中,导致表头的id变成了[BOM]id。后续通过array_combine生成数组键名,再转成对象属性名后,这个不可见字符会保留,直接用$obj->id自然无法匹配到实际的属性名。
内容的提问来源于stack exchange,提问作者WhocaresMcgee
相关产品推荐
相关产品推荐

