PHP使用变量访问嵌套对象属性

时间:2019-08-26 13:45:44

标签: php cakephp-3.0 php-7

我正在使用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

2 个答案:

答案 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;
    }