我正在使用PHP7。
我有一个要解析的对象:
$RECORD = {
'name' => 'Stephen Brad Taylor',
'address' => '432 Cranberry Hills, Pittsburg',
'phone' => '708 865 456',
'Account' => (Object Vendor/Entity/User) {
'email' => 'INeedThisEmail@pleaseHelp.com' // I want to access this property.
'id' => 34,
'accessible' => ['email', 'id]
}
}
我有一个数组,可用于从RECORD
中选择某些字段:
$fieldnames = [
'name',
'address',
'phone',
'Account["email"]'
];
我正尝试从fieldnames
解析RECORD
,如下所示:
$data[]
foreach($fieldnames as $k => $fieldname) {
$data[k] = $RECORD->$fieldname
}
以上方法适用于第一级属性:name, address, and phone
。但是,email
返回null。
我在下面尝试了以下方法,但都没有成功:
$data[k] = RECORD->${$fieldname}
$propertyName = '$RECORD->$fieldname'
$data[k] = ${$propertyName}
有人知道一种使用对象引用中的字符串 访问对象属性的方法吗?
非常感谢<3
答案 0 :(得分:2)
您不能直接将Account["email"]
用作属性访问器,也不会拆分它来查找嵌套的属性。您需要自己解析。
foreach($fieldnames as $k => $fieldname) {
if (preg_match('/^(.*)\["(.*)"\]$/', $fieldname, $match) {
$data[$k] = $RECORD->{$match[1]}->{$match[2]};
} else {
$data[$k] = $RECORD->$fieldname;
}
}
此外,您还需要$
中的$k
。
此代码仅适用于1级深度。如果需要处理任意级别,则必须编写一个递归过程。有关如何进行编码的示例,请参见How to access and manipulate multi-dimensional array by key names / path?。
答案 1 :(得分:1)
我在这种情况下使用匿名函数。 (PHP 7.4)
$index = fn($item) => $item->dotaItem->prop_def_index;
if (get_class($collection) === Collection::class) {
$index = fn($item) => $item->prop_def_index;
}