2015-08-28 46 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