Помогите с рекурсией

Духовность™

Продвинутый новичок
Помогите с рекурсией

Народ, помогите, хрен знает какой час пытаюсь написать
рекурсивную функцию, а она не хочет работать, вот хоть убей.
Вот объясните, ГДЕ ТУТ ОШИБКА?

Нужно создать массив вида:

PHP:
$tree = array(
0 => array( // дети рута
    'company' => array('id' => 1, 'type' => 'page'),
    'news' => array('id' => 2, 'type' => 'news'),
),
1 => array( // дети для id=1
    'news' => array('id' => 3, 'type' => 'news'),
)
//  и т.д.
);
из массива serialize

PHP:
$serialize = 'a:5:{i:0;a:2:{i:0;a:3:{s:2:"id";s:1:"1";s:3:"pid";s:1:"0";s:15:"structure_alias";s:5:"admin";}i:1;a:3:{s:2:"id";s:1:"4";s:3:"pid";s:1:"0";s:15:"structure_alias";s:2:"my";}}i:1;a:1:{i:0;a:3:{s:2:"id";s:1:"2";s:3:"pid";s:1:"1";s:15:"structure_alias";s:4:"user";}}i:2;a:1:{i:0;a:3:{s:2:"id";s:1:"3";s:3:"pid";s:1:"2";s:15:"structure_alias";s:4:"edit";}}i:4;a:1:{i:0;a:3:{s:2:"id";s:1:"5";s:3:"pid";s:1:"4";s:15:"structure_alias";s:7:"adverts";}}i:3;a:1:{i:0;a:3:{s:2:"id";s:1:"6";s:3:"pid";s:1:"3";s:15:"structure_alias";s:3:"new";}}}';

make(unserialize($serialize));

    function make(&$data, $k=0, $indent=-1)
    {
        if (empty($data[$k]))
        {
            return ;
        }

        $indent++;

        foreach ($data[$k] as $item)
        {
            $item['indent'] = $indent;
            $tree[$indent][$item['structure_alias']] = $item;

            $t = make($data, $item['id'], $indent);

            if ($t)
            {
                list($key, $value) = each($t);
                list($key2, $value2) = each($value);

                $tree[$key][$value2['structure_alias']] = $value2;
            }

        }

        return $tree;
    }
данная функция работает только в том случае, если хранилище $tree объявить как global. Я уже мозг сломал. В чем ошибка????

PS: ненавижу рекурсию, просто терпеть не могу.
 

soines

Новичок
PHP:
Array
(
    [0] => Array
        (
            [admin] => Array
                (
                    [id] => 1
                    [pid] => 0
                    [structure_alias] => admin
                    [indent] => 0
                )

            [my] => Array
                (
                    [id] => 4
                    [pid] => 0
                    [structure_alias] => my
                    [indent] => 0
                )

        )

    [1] => Array
        (
            [user] => Array
                (
                    [id] => 2
                    [pid] => 1
                    [structure_alias] => user
                    [indent] => 1
                )

            [adverts] => Array
                (
                    [id] => 5
                    [pid] => 4
                    [structure_alias] => adverts
                    [indent] => 1
                )

        )

)
Твоя функция возвращает это. Это правильно? И объявлять как глобал ничего не надо.
 

Духовность™

Продвинутый новичок
Это правильно?
правильно! но куда-то теряются ещё два элемента массива:

PHP:
.
    
    [2] => Array
        (
            [edit] => Array
                (
                    [id] => 3
                    [pid] => 2
                    [structure_alias] => edit
                    [indent] => 2
                )

        )

    [3] => Array
        (
            [new] => Array
                (
                    [id] => 6
                    [pid] => 3
                    [structure_alias] => new
                    [indent] => 3
                )

        )
:(
 

Adelf

Administrator
Команда форума
PHP:
	function make(&$data, $k=0, $indent=-1)
    {
        if (empty($data[$k]))
        {
            return false;
        }

        $indent++;
        
        $tree = array();

        foreach ($data[$k] as $item)
        {
            $item['indent'] = $indent;
            $tree[$indent][$item['structure_alias']] = $item;
            
            $t = make($data, $item['id'], $indent);

            if ($t)
            {
            	foreach($t as $key => $val)
            	{
            		foreach($val as $key2 => $val2)
            		{
            			$tree[$key][$val2['structure_alias']] = $val2;
            		}
            	}
            }
        }

        return $tree;
    }
Вроде работает.
triumvirat вот ты поднимаешь тут хорошие серьезные темы, ООП, все дела, но простой обычный код, который не требует особых умственных усилий, у тебя - ужас.

-~{}~ 03.07.10 14:01:

PHP:
list($key, $value) = each($t);
list($key2, $value2) = each($value);

$tree[$key][$value2['structure_alias']] = $value2;
Этот кусок ооочень сильно удивил.
 

Духовность™

Продвинутый новичок
Adelf
Спасибо!!!!! Я 5 минут назад точно такой же код написал и он у меня не работал по банальной,как оказалось, причине - ВВЕЛ ИМЕНА ПЕРЕМЕННЫХ, КОТОРЫЕ УЖЕ БЫЛИ ИНИЦИАЛИЗИРОВАНЫ ДРУГИМ ЗНАЧЕНИЕМ! ААААААААА

т.е.:

PHP:
foreach ($t as $key => $value)
{
    foreach ($value as $key2 =>  $data) //  $data уже была задействована в вышестоящем цикле :(
    {
        $tree[$key][$data['structure_alias']] = $data;   
    }
}
 

Духовность™

Продвинутый новичок
zerkms
Мне вот концепция вашего сайта говнокода не нравится. Может быть идея была и хорошая, но сейчас туда заходить как-то противно - огромное количество людей с нездоровым ЧСВ. Как не посмотрю на анонимные комментарии, везде пишут, что "PHP - говно", "PHP для быдла". Мягко говоря, какое-то странное поведение - приходить и анонимно писать, что PHP-говно. Да и в целом, сидеть и искать соринки в глазах других - занятие, скажем так, весьма странное. Это аналогично поведению школьника, когда он пытается найти изъяны в другом более слабом для того, что унизить его и тем самым выразиться в толпе.
 

zerkms

TDD infected
Команда форума
triumvirat
Не пофиг ли? Я уже давно игнорю такие комменты :)
Все понимают, что это тролли :)
 

Adelf

Administrator
Команда форума
triumvirat
и тем не менее видно как добродушный PHP губит в тебе хорошего программиста.

пустые ретурны, в функции, которая возвращает значение. Неинициализированные переменные, которые PHP сам превращает в массивы. Нетипизированная переменная $data изза которой ты потерял время. Это все плохие привычки, которые PHP допускает у себя. Со временем эти плохие привычки, дают вот такие вот плоды.

-~{}~ 03.07.10 15:54:

Забыл мораль - отучись от этих привычек. погляди внимательней на мой код функции. Там я инициализирую массив и возвращаю false. Это все не просто так. Это грабли, на которые я уже не раз наступал.
 
Сверху