2015-08-28 50 views
1

我有存储在多个层面数据的对象(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',则不会。有没有办法完成我想要的,还是我看错了?

+0

你看过递归函数吗? – Gogol

回答

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 
+0

绝对让我走向正确的方向。我还需要支持阵列,所以下面是最终为我工作的代码: http://pastebin.com/jVpTybZg –

0

为什么你不使用$db = json_decode($json, true);而不是$db = json_decode($json);

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

json_decode(字符串$ JSON,布尔$缔合)

  • JSON

    JSON字符串进行解码。

    此函数仅适用于UTF-8编码的字符串。

  • ASSOC

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

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