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

如何访问含特殊字符键的PHP对象属性?关联数组转换问题

问题:访问含特殊字符的对象属性并转换数组格式

我来帮你解决这个问题!首先你遇到的语法错误,是因为对象的属性名包含括号这类特殊字符,常规的->属性名写法无法正确解析。下面分两部分给你讲清楚解决方案:


1. 访问含特殊字符的对象属性的正确方式

当对象的属性名包含括号、空格、连字符这类特殊符号时,你需要用大括号包裹字符串形式的属性名来访问,这样PHP才会把引号里的内容当作完整的属性名解析,而不是试图把它当成变量或函数调用。

对比错误和正确写法:

// 错误写法(会触发语法错误)
$a->[question(9)]

// 正确写法
$a->{'question(9)'}

2. 实现目标数组的完整转换

结合你的需求,我们可以修改array_map里的匿名函数,正确提取并转换需要的字段。这里提供两种方案:

方案一:提取指定字段(匹配你的示例需求)

如果只需要提取id、submitted和question_9这几个字段,代码可以写成这样:

$derived = array_map(function ($a) {
    return [
        'id' => $a->id,
        'submitted' => $a->datesubmitted,
        'question_9' => strtolower($a->{'question(9)'}) // 转小写匹配你的示例格式
    ];
}, $survey_array);

方案二:批量处理所有question字段(可选优化)

如果你需要把所有question(X)格式的属性都自动转换成question_X的形式,还能过滤空值,可以用遍历+正则匹配的方式批量处理:

$derived = array_map(function ($a) {
    // 先初始化固定字段
    $result = [
        'id' => $a->id,
        'submitted' => $a->datesubmitted
    ];
    
    // 遍历对象的所有属性
    foreach ($a as $key => $value) {
        // 匹配question(X)格式的属性名
        if (preg_match('/^question\((\d+)\)$/', $key, $matches)) {
            $newKey = 'question_' . $matches[1];
            // 只保留非空值(可选,根据你的需求调整)
            if (!empty($value)) {
                $result[$newKey] = strtolower($value);
            }
        }
    }
    
    return $result;
}, $survey_array);

最终效果

运行上述代码后,你会得到和期望一致的数组格式:

Array (
    [0] => Array (
        [id] => 67
        [submitted] => 2018-05-24 03:56:35
        [question_9] => yes
        // 如果有其他非空的question字段,也会自动添加进来
    )
)

内容的提问来源于stack exchange,提问作者sumit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:41:11