如何访问不确定深度的对象属性

时间:2015-08-28 17:44:40

标签: php arrays object

我有一个对象,数据存储在多个级别(JSON解码文档),如下所示:

$db = (object) array(
    'simple_property' => 'value',
    'complex_property' => (object) array(
        'key' => 'value',
        'nested' => (object) array(
            'key' => 'value'
        )
    )
);

我希望能够通过参考访问和更新任何深度的数据。例如:

$db->{ $key } = $new_value

如果$key等于'simple_property',则可行。但如果$key等于'complex_property->nested->key',则不会。{{1}}。有没有办法实现我想要的,或者我是否错误地看待它?

2 个答案:

答案 0 :(得分:1)

我认为你无法以这种方式工作。你必须创建一个函数(或类方法)来做类似的事情。举个例子:

function getRecursiveProperty($object, $path)
{

  $array = explode('->', $path);

  if (empty($array))
  {
    return NULL;
  }

  foreach ($array as $property)
  {

    if (!isset($object->$property))
    {
      return NULL;
    }

    if (!is_object($object->$property))
    {
      return $object->$property;
    }

    $object = $object->$property;

  }

  return $object->$property;

}

function setRecursiveProperty($object, $path, $value)
{

  foreach (explode('->', $path) as $property)
  {

    if (!isset($object->$property))
    {
      return FALSE;
    }

    if (!is_object($object->$property))
    {

      $object->$property = $value;

      return TRUE;

    }

    $object = $object->$property;

  }

  return FALSE;

}

$key = 'complex_property->nested->key';

echo getRecursiveProperty($db, $key); // value

setRecursiveProperty($db, $key, 'new_value');

echo getRecursiveProperty($db, $key); // new_value

答案 1 :(得分:0)

为什么不使用$db = json_decode($json, true);代替$db = json_decode($json);

通过这种方式,您将返回一个关联数组而不是一个对象,您将不再遇到这些问题。

  

json_decode(字符串$ json,bool $ assoc)

     
      
  • <强> JSON

         

    正在解码的json字符串。

         

    此功能仅适用于UTF-8编码的字符串。

  •   
  • <强> ASSOC

         

    TRUE 时,返回的对象将被转换为   关联数组。

  •   

更多信息:http://php.net/manual/en/function.json-decode.php