Как получить доступ к свойству объекта неопределенной глубины

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
    Вы изучили рекурсивные функции?
Теги:
object
arrays

2 ответа

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
    Определенно установите меня в правильном направлении. Мне также нужно было поддерживать массивы, поэтому вот код, который в итоге работал на меня: pastebin.com/jVpTybZg
0

Почему вы не используете $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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню