You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:05:18