Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将嵌套对象链存储在变量中_Php - Fatal编程技术网

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

Php 将嵌套对象链存储在变量中,php,Php,假设我有一个这样的物体 { "status": "AlreadyVerified" } 我想把propert键存储在变量中,这样我就可以像 $key = 'status'; echo $object->$key 但是如果我有一个嵌套对象,比如 { "extra_info": {#305 ▼ +"status": "AlreadyVerified" } } 这行不通 $key = 'extra_info->status'; echo $object

假设我有一个这样的物体

 {
      "status": "AlreadyVerified"
 }
我想把propert键存储在变量中,这样我就可以像

$key = 'status';
echo $object->$key
但是如果我有一个嵌套对象,比如

{
  "extra_info": {#305 ▼
    +"status": "AlreadyVerified"
  }
}
这行不通

$key = 'extra_info->status';
echo $object->$key
如何将嵌套对象链存储在变量中,以便使用该变量访问其属性


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

这是一种方法,尽管可能不安全,这取决于
$key
的来源:

<?php
$object = new stdClass();

$object->extra_info = new stdClass();

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

$key = 'extra_info->status';

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

可以通过如下方式编写帮助函数:

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');

thanx,我要试试$密钥存储在数据库中,所以由管理员提供,所以没问题,我猜是的,thanx我将进行投票,但我将使用@brevis方法,因为我不喜欢评估。。。thanx Again手边的问题显示了一个嵌套在对象中的对象和其他阵列变体失败。
echo deepFind($o,'extra_info->status')