@mixejuxix

Как преобразовать дерево в несколько плоских массивов?

Привет, есть задача валидировать дерево средствами laravel, для этого там используются правила, типа таких:
'questions.0.answers.0.questions.0.text' => 'required'
'questions.0.answers.0.questions.1.text' => 'required'
'questions.0.answers.1.questions.0.text' => 'required'

Для генерации подобных правил я хочу преобразовать дерево в плоские массивы, но немогу допетрить до алгоритма :-(

К примеру есть дерево:
Что будете есть?
        Торт
        Пирог
        Суп
            Какой?
                Борщ
                Солянка

Нужно разложить его в массивы

['Что будете есть?']
['Что будете есть?', 'Торт']
['Что будете есть?', 'Пирог']
['Что будете есть?', 'Суп']
['Что будете есть?', 'Суп', 'Какой?']
['Что будете есть?', 'Суп', 'Какой?', 'Борщ']
['Что будете есть?', 'Суп', 'Какой?', 'Солянка']


При этом данные немного сложнее:
json

[
  {
    "text": true,
    "content": "Что будете есть?",
    "child": [
      {
        "text": true,
        "content": "Торт",
      },
      {
        "text": true,
        "content": "Пирог",
      },
      {
        "text": true,
        "content": "Суп",
        "child": [
          {
            "text": true,
            "content": "Какой?",
            "child": [
              {
                "text": true,
                "content": "Борщ",
              },
              {
                "text": true,
                "content": "Солянка",
              }
            ]
          }
        ]
      }
    ]
  }
]



И раскладывать их надо соответственно в двумерный массив:
примерно так

[[text => true, content => 'Что будете есть?']],
[[text => true, content => 'Что будете есть?'], [text => true, content => 'Торт']]
[[text => true, content => 'Что будете есть?'], [text => true, content => 'Пирог']]
[[text => true, content => 'Что будете есть?'], [text => true, content => 'Суп']]
[[text => true, content => 'Что будете есть?'], [text => true, content => 'Суп'], [text => true, content => 'Какой?']]
и так далее



Так же, возможно, в laravel есть какие то более правильные способы валидации дерева?

Спасибо!
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 1
Приветствую!
То, что вам нужно, скорее всего Helper Arr::dot самого Laravel.

Запихнул ваш json в dot и вывалил через dd(), получил:

5df0e0f9d1953668298532.jpeg

P.S. Соответственно алгоритм генерации подобного, вы можете глянуть через Ctrl + ЛКМ по функции в вашей IDE. (Если используете софт от JetBrains)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы