将嵌套的对象链存储在变量中

时间:2018-09-18 14:32:17

标签: php

所以可以说我有一个像这样的对象

 {
      "status": "AlreadyVerified"
 }

并且我想将propert键存储在变量中,这样我就可以使用该变量(如

)访问属性
$key = 'status';
echo $object->$key

但是如果我有一个像

这样的嵌套对象怎么办
{
  "extra_info": {#305 ▼
    +"status": "AlreadyVerified"
  }
}

这行不通

$key = 'extra_info->status';
echo $object->$key

如何将嵌套对象链存储在变量中,以便可以使用该变量访问其属性?

最好是某种既适用于嵌套对象又适用于平面对象的方法(我想这就是所谓的!)

2 个答案:

答案 0 :(得分:1)

这是一种实现方法,尽管根据$key的来源可能不安全:

<?php
$object = new stdClass();

$object->extra_info = new stdClass();

$object->extra_info->status = 'AlreadyVerified';

$key = 'extra_info->status';

eval( 'echo $object->'.$key.';' );

输出:

  

已验证


此外,如果您想解析$key,则可以使用递归函数来访问嵌套值。

答案 1 :(得分:1)

可以通过这样的写辅助函数来实现:

function deepFind($o, $key) {
    $key = explode('->', $key);
    $value = $o;    
    foreach ($key as $i=>$k) {
        if (is_object($value) && isset($value->{$k})) {
            $value = $value->{$k};
        } elseif (is_array($value) && isset($value[$k])) {
            $value = $value[$k];
        } elseif ($i == count($key) - 1) {
            $value = null;
        }
    }
    return $value;
}

用法:

$o = (object)[
  "extra_info" => (object)[
    "status" => "AlreadyVerified"
  ]
];

echo deepFind($o, 'extra_info->status');

Online demo