我有一个对象,数据存储在多个级别(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}}。有没有办法实现我想要的,或者我是否错误地看待它?
答案 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 时,返回的对象将被转换为 关联数组。