Как эффективно построить дерево из плоской структуры в php? - PullRequest
3 голосов
/ 11 июля 2011

структура данных массива:

 id   name    parent_id   children

теперь у меня есть корневой массив и набор дочерних массивов, я хочу построить древовидную структуру, и вот что у меня есть:

Обновлены ::

function buildTree($root,$children)
{   
    foreach($children as $key=>$val){
        print_r($val);
        $val['children']=array();
        if($val['parent_id']==$root['id']){
            $root['children'][]=$val;
            //remove it so we don't need to go through again
            unset($children[$key]);
        }
    }
    if(count($root['children'])==0)return;
    foreach($root['children'] as $child){
        $this->buildTree($child,$children);
    }
}

возвращает тот же корень, не добавленные дети кто-нибудь может мне помочь с этим. Большое спасибо.

обновление : print_r ($ val) распечатать:

 Array
(
[id] => 3
[name] => parent directory2
[type] => d
[creat_time] => 2011-07-08 06:38:36
[parent_id] => 1
[user_id] => 1
)
Array
(
[id] => 5
[name] => parent directory3
[type] => d
[creat_time] => 2011-07-08 06:38:36
[parent_id] => 1
[user_id] => 1
)
 .....

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

Попробуйте изменить свою функцию, чтобы получить параметры по ссылке, например:

function buildTree(&$root,&$children) {

в противном случае вы получите свежую копию ваших корневых / дочерних массивов при каждом вызове, и, следовательно, вы никогда не получите целое дерево.

Более подробную информацию вы найдете в руководстве: http://www.php.net/manual/en/language.references.pass.php

0 голосов
/ 04 декабря 2015

Если эффективность - это то, что вы запрашиваете, вы можете рассмотреть возможность использования ссылки вместо рекурсии, как описано здесь: https://stackoverflow.com/a/34087813/2435335

Это сокращает время выполнения до менее секунды

0 голосов
/ 11 июля 2011

похоже, что ваш массив $ children начинается с 1, но ваше "for" начинается с 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...