如何访问含特殊字符键的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
相关产品推荐
相关产品推荐

