У меня есть объект с данными, хранящимися на нескольких уровнях (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'
, это не так. Есть ли способ выполнить то, что я хочу, или я смотрю на него неправильно?
Я не думаю, что вы можете заставить его работать таким образом. Вам нужно будет создать функцию (или метод класса), чтобы сделать что-то подобное. В качестве примера:
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
Почему вы не используете $db = json_decode($json, true);
вместо $db = json_decode($json);
?
Таким образом вы возвращаете ассоциативный массив вместо объекта, и у вас больше не будет этих проблем.
json_decode (строка $ json, bool $ assoc)
JSON
Строка json декодируется.
Эта функция работает только с закодированными строками UTF-8.
ассоциативный
Когда TRUE, возвращенные объекты будут преобразованы в ассоциативные массивы.
Дополнительная информация: http://php.net/manual/en/function.json-decode.php