Хелп. Рекурсия

Scarrr

Новичок
Хелп. Рекурсия

есть массив типа.
Код:
Array
(
    [1] => Array
        (
            [id] => 1
            [pid] => 0
            [title] => Админ панель
        )

    [2] => Array
        (
            [id] => 2
            [pid] => 1
            [title] => Работа с каталогами
        )

    [12] => Array
        (
            [id] => 12
            [pid] => 1
            [title] => Тест
        )

    [11] => Array
        (
            [id] => 11
            [pid] => 2
            [title] => Ресурсы
        )

)
и т.п. до бесконечности
из него надо получить список вида
Код:
Админ-панель
--Работа с каталогами
----Ресурсы
--Тест
нужен код рекурсивной функции, которая бы делала это.... ссылки на статьи и проч. прошу не предлагать, уже все распечатал и перечитал, но рекурсия мое слабое место... если можно - с комментами, чтобы я разобрался....

заранее спасибо.
 

lucas

Guest
Свой код (с сообшениями об ошибках) -- сюда.

Иначе -- 50 $.
 

Scarrr

Новичок
моя функция
PHP:
	function _recurse($src, $g_src, $cmpl, $vect, $space)
	{
		foreach ($src as $k=>$v){
			if (!getVar($cmpl,$k)){ // если еще не прошли это значение
				$cmpl[$k]=1; // пройдем его
				if (getVar($g_src,$k) && is_array($g_src[$k])) {// если есть подмассив среди группированных
					$new_src=$g_src[$k];
					$vect[]=$space.$v['title'];
					$vect=array_merge($vect,_recurse($new_src,$g_src,$cmpl, $vect,$space."-"));
					}
				else {$vect[]=$space.$v['title']; }
				}
			else {$cmpl[$k]=1; return $vect; }
		}
		return $vect;
	}
$src - Сам массив.
$g_src - массив группированный по id. т.е. имеет вид
Код:
Array
(
    [1] => Array
        (
            [2] => Array
                (
                    [id] => 2
                    [pid] => 1
                    [title] => Работа с каталогами
                )

        )

    [2] => Array
        (
            [11] => Array
                (
                    [id] => 11
                    [pid] => 2
                    [title] => Ресурсы
                )

        )

)
$cmpl - вектор пройденных.
$vect - сам конечный вектор
$space - пробелы, которые ставятся вперед.

на выходе получаю:
Код:
Array
(
    [0] => Админ панель
    [2] => -Работа с каталогами
    [5] => --Ресурсы
    [6] => Работа с каталогами
    [14] => -Ресурсы
    [15] => Тест
    [16] => Ресурсы
)
ошибок при выполнении нет (в смысле ошибок компилятора). Но результат очевидно не тот....
пы.сы. ранее результат был еще хуже... имел вид примерно
Array
(
[0] => Админ панель
[2] => -Работа с каталогами
[5] => --Ресурсы
)
т.е. углублялся только на одну ветку, а потом полностью выходил из рекурсии.
 

BOJIK

Новичок
Scarrr
Вот написал за пять минут, что непонятно спрашивай.
PHP:
<?php
    function makeList($arr, $start = 0, $level = 0)
    {
        $ret = array (); 
        foreach ($arr as $key => $item){ 
            if ($item['pid'] == $start){ 
                $ret[] = str_repeat('--', $level) . $item['title'];
                unset($arr[$key]);
                $ret = array_merge($ret, makeList($arr, $key, $level+1));
            }
        }
        return $ret;
    }
    
    $arr = array (
        1 => array ('id' => 1, 'pid' => 0, 'title'=>'Админ панель'),
        2 => array ('id' => 2, 'pid' => 1, 'title'=>'Каталоги'),        
        12 => array ('id' => 12, 'pid' => 1, 'title'=>'Ресурсы'),                
        11 => array ('id' => 11, 'pid' => 2, 'title'=>'Текст'),                    
    );
    echo '<pre>';
    print_r(makeList($arr));
    echo '</pre>';
?>
 

Scarrr

Новичок
BOJIK
пипец.... научите меня такому же :))
спасибо... вроде разобрался что к чему...
 
Сверху