Как решить проблему с древовидной структурой?

113
08 июня 2021, 21:10

Всем привет мне надо сделать древовидную структуру!

function CreateTree($tree)
        {
            $parrent=[];
             foreach($tree as $key=>$item){
            $parrent[$item['id_parrent']][$item['id']]=$item;
               }  
               $treeElem=$parrent;
              generateElem($treeElem, $parrent);
              return $treeElem;
        }
    function generateElem(&$treeElem, $parrent)
    {
        foreach($treeElem as $key=>$item){
            if(!isset($item['sub-categories'])){
                $treeElem[$key]['sub-categories']=[];
            }
            if(array_key_exists($key,$parrent)){
                $treeElem[$key]['sub-categories']=$parrent[$key];          
                generateElem($treeElem[$key]['sub-categories'], $parrent); 
            }
        }
    }
   print_r(CreateTree($tree)); // вывод массива  которую хочу сделать древовидным!

Функция CreateTree создает древку, в ней есть функция generateElem которая если у элемента есть дети то создаются подкатегории! Я понял что проблема заключается в generateElem($treeElem[$key]['sub-categories'], $parrent); этой строчке где применяется рекурсивный метод! без этой строчки весь код работает но без под категорий. то есть детей!

Но у меня выходит такая ошибка!

Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes) in /home/index.php on line 618

Я пробовал изменять память не помогло, я смотрел в интернете и все говорили про изменение памяти! НО так и не нашел способ решения проблемы надеюсь кто нибудь подскажет! Возможно из за бесконечного цикла, я так не считаю! Помогите пожалуйста 3 дня об голову боюсь!

Answer 1

Алгоритм:

  1. Массив всех элементов и идентификатор текущего родителя (изначально 0/nothing/null/weverever).

  2. Просмотрите все элементы.

  3. Если parent_id элемента совпадает с текущим parent_id, полученным в 1., элемент является дочерним от родительского ID.

  4. Поместить в список текущих детей (здесь: $branch).

  5. Вызов функции рекурсивно с идентификатором только что идентифицированного в п 3 элемента, т.е. найти все дочерние элементы этого элемента, и добавить их в качестве дочерних элементов.

  6. Дерево построено.

Функция

function buildTree(array $elements, $parentId = 0) {
    $branch = array();
    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}
$tree = buildTree($rows);
READ ALSO
Как сделать ссылку с сегодняшней датой?

Как сделать ссылку с сегодняшней датой?

Делаю ссылки в ввиде http://siteru/main

110
Проблема с chat_invite_user_by_link (объект messages)

Проблема с chat_invite_user_by_link (объект messages)

Я решил обратиться к вам за помощью, ибо сам не понимаю как с этим боротьсяУ меня есть паблик-бот, который состоит в беседе, имеет полный доступ...

226
Не работает json_encode с большим массивом

Не работает json_encode с большим массивом

Не работает json_encode с большим массивом

157