перевести массив к виду структуры

grav20

Новичок
перевести массив к виду структуры

День добрый, года 2 уже постоянно читаю этот форум и как правило находил все поиском, так что вопросы раньше и не задавал... :)
Но в этот раз столкнулся с проблемой, которую решить не удается уже пару дней несмотря на кажущуюся простоту.
Есть стуктура каталога, которая хранится в базе, запрос мне возвращает структуру от заданного элемента, см в общем http://dbtree.dklab.ru/search.php?mask=www&depth=4&num=10&count=on (это решение здесь на форуме упоминалось)
получаем массив
PHP:
array (
   array (children, grandchildren, ...) , // и так далее количество чилдренов не ограничено (заранее не известно)
    array (children2, grandchildren2, ...),
    array (children3, grandchildren2, ...),
    array (children2, grandchildren3, ...),
    array (children3, grandchildren4, ...),
...
)
Чтобы было наглядно, можно представить эти строки как пути к файлам, см ссылку выше.
Для удобства работы с массивом (чтобы вывести деревом или узнать всех потомков children3) хотелось бы перевести массив к виду струкутры (дерева), например,
PHP:
array 
   (array
      ( self, 
        child(array
                        ( self,
                           child
                        ),
                 array
                        ( self,
                           child
                        )
               )
)
Естесственно, первым делом начал делать это через рекурсию
PHP:
function childslist($row, $level) {
		$tt['self']['id'] = $row[$level.".id"];
		$tt['self']['pid'] = $row[$level.".pid"];
		$tt['self']['title'] = $row[$level.".title"];
		$tt['self']['path'] = $path;
		$tt['self']['shortcut'] = $row[$level.".shortcut"];
		$level++;
		if ($level<=$this->depth and $row[$level.".id"]>0) $tt['childs']=$this->childslist($row, $level);
		$t[$row[($level-1).".id"]]=$tt;
		return $t;
	}

$output['childs']=childslist($row, $level);
Однако в результате возвращается только последняя ветка, предыдущие ветки затираются, а не добавляются.
Может взгляните свежим взглядом, подскажите ошибку?
 

Кром

Новичок
Сфорируй небольшой массив из двух-трех элементов и скопируй сюда, что бы его можно было вставить в код и потестить.
А то визуально с первого взгляда не скажешь в чем ошибка.
 

grav20

Новичок
Вот кусок кода, можно сразу использовать его. Здесь тоже возвращает только последнюю ветку.
PHP:
$rows=array (
Array
(
'0.id' => 1176,
'0.pid' => 0,
'0.title' => 'Новости',
'0.shortcut' => 'news',
'1.id' => '2033',
'1.pid' => '1176',
'1.title' => 'Самое важное',
'1.shortcut' => 'important',
'2.id' => '',
'2.pid' => '',
'2.title' => '',
'2.shortcut' => ''
),

Array
(
'0.id' => 1176,
'0.pid' => 0,
'0.title' => 'Новости',
'0.shortcut' => 'news',
'1.id' => 1177,
'1.pid' => 1176,
'1.title' => 'События в регионе',
'1.shortcut' => 'region',
'2.id' => 1,
'2.pid' => 1177,
'2.title' => 'Димитровград помогает в приобретении жилья бюджетникам',
'2.shortcut' => 1
),

Array
(
'0.id' => 1176,
'0.pid' => 0,
'0.title' => 'Новости',
'0.shortcut' => 'news',
'1.id' => 1177,
'1.pid' => 1176,
'1.title' => 'События в регионе',
'1.shortcut' => 'region',
'2.id' => 3,
'2.pid' => 1177,
'2.title' => 'День карьеры в Димитровграде',
'2.shortcut' => 3
)
);


function childslist($row, $level) {
	$tt['self']['id'] = $row[$level.".id"];
	$tt['self']['pid'] = $row[$level.".pid"];
	$tt['self']['title'] = $row[$level.".title"];
	$tt['self']['path'] = $path;
	$tt['self']['shortcut'] = $row[$level.".shortcut"];
	$level++;
	if ($row[$level.".id"]>0) $tt['childs']=childslist($row, $level);
	$t[$row[($level-1).".id"]]=$tt;
	return $t;
}


foreach ($rows as $row) {
	$output=childslist($row, 0);
}

		echo "<pre>";
		print_r($output);
		echo "</pre>";
		exit();
 

Кром

Новичок
>$output=childslist($row, 0);

Этой строкой в цикле ты переписываешь предыдущие значения.
 

grav20

Новичок
а как еще можно придумать?
Если вот так
PHP:
$output[]=childslist($row, 0);
то получаем просто набор веток и возвращаемся к вопросу как получить структуру
А если вот так
PHP:
$output=$output+childslist($row, 0);
То 2-й уровень "чилдренов" все равно не сохраняется.
Наверное ошибка все-таки в финкци (рекурсии)
PHP:
if ($row[$level.".id"]>0) $tt['childs']=childslist($row, $level);
Здесь тоже обнуляются чилдрены. Как проверить в рекурсии, существует ли уже это ответвление, даже представить не могу
 

Кром

Новичок
>$output=$output+childslist($row, 0);

Это вообще непонятно что получится. Это ты массивы так соединяешь?

>Здесь тоже обнуляются чилдрены. Как проверить в рекурсии, существует ли уже это ответвление, даже представить не могу

Делай вывод после каждого цикла, чего тут сложного.
 
Сверху