nepster-web
@nepster-web

Вложенная структура по линиям, рекурсия

Подскажите, пожалуйста, как решить задачу, никак не выходит рекурсия:

Есть дерево вложенности:

- Овощи 
    - картошка
        - топинамбур 
    - капуста 
        - молодая 
        - старая 
    - буряк 
        - свежий 
 - Фрукты 
   - бананы 
   - яблоки 
   - груши 
- ягоды 
   - арбуз 
   - малина 
       - по дешевле 
       - по дороже


Вложенность представлена массивом, все дочерние элементы элемента находятся в ['items'].

Задача такая, нужно собрать массив, который сделает эту бесконечную вложенность по линиям, то есть:

[0] - 1 линия
[0] Овощи
[1] Фрукты
[2] ягоды

[1] - 2 линия
[0] - картошка
[1] - капуста
[2] - буряк
[3] - бананы
[4] - яблоки
[5] - груши
[6] - арбуз
[7] - малина

[2] - 3 линия
[0] топинамбур
[1] молодая
[2] старая
[3] свежий
[4] по дешевле
[5] по дороже

Моя наработка:

function getStructToLine($getStruct, $tree = true)
    {
        $result = array();
        
        if($getStruct && is_array($getStruct))
        {
            foreach($getStruct as $line => $user)
            {
                
                if($tree)
                    $result[$line][] = $user['user_id'];
                else 
                    $result[$line] = $user['user_id'];
                
                
                if(isset($user['items']))
                {
                     $child = $this->getStructToLine($user['items'], false);
                     
                     $result[$line][] = $child;
                }
            }
        }
        
        return $result;
    }


Выбивает ошибку, хотя не понимаю почему.
  • Вопрос задан
  • 2633 просмотра
Пригласить эксперта
Ответы на вопрос 2
@veontomo
Три вопроса:
1. какова точная структура $getStruct?
2. с какими параметрами изначально вызывается getStructToLine()?
3. какая ошибка выдается?
Видимо, опечатки:
1. ключ 'user_id' в $user['user_id']
2. $this->getStructToLine(...)
Ответ написан
@veontomo
Если еще не сделали, то совет такой:
1. Ваш массив пользователей - это объект класса User со свойствами
user_id: Integer
items: array of User
2. сделайте сигнатуру рекурсивной функции такой:
User, Array -> Array
где Array это тот накопитель, который Вам нужен в качестве ответа и в который постепенно надо перегонять данные из первого аргумента рекурсивной функции до тех пор пока он не станет "пустым".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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