@NewSantaClaus

Как рекурсивно обойти объект и выполнить get_object_vars?

Есть некий класс, в который вносятся данные.

Задача. после внесения всех данных этот экземпляр класса нужно преобразовать в json.

Пример класса:
class Text
{

    protected string $text;

    protected Text $children;

    protected string $type = "text";

    public function setText(string $text): self
    {
        $this->text = $text;
        return $this;
    }

    public function setChildren(Text $children): self
    {
        $this->children = $children;
        return $this;
    }

    public function expose()
    {
        return get_object_vars($this);
    }
}


Когда я делаю вот так, то все как бы хорошо
$text = (new Text())->setText("text");
     echo json_encode($text->expose());
     // {"text":"text","type":"text"}


Но как только я указываю children
$text2 = (new Text())->setText("text")->setChildren($text);
     echo json_encode($text2->expose());
     // {"text":"text","children":{},"type":"text"}


То внутренний объект не форматируется, в свойстве children находится пустота
Как это исправить?

Песочница здесь
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
0xD34F
@0xD34F
public function expose() {
  return array_map(fn($n) => $n instanceof Text ? $n->expose() : $n, get_object_vars($this));
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вместо get_object_vars использовать явное формирование массива свойств с рекурсивным вызовом expose для дочернего объекта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
28 апр. 2024, в 08:27
7000 руб./за проект
28 апр. 2024, в 08:18
15000 руб./за проект
28 апр. 2024, в 02:30
3000 руб./за проект