Функция вывода дерева не выполняется второй раз.

VANHALEN

Новичок
Ай ай ай.. Сейчас буду тупить, есть гуру которые скажут что делать, выкинуть эту функцию, или доделать как?
Есть функция для вывода дерева. Не моя, я только немного вывод подправил под себя.
PHP:
function menu($group)	
	{
		$result = mysql_query("SELECT * FROM `menu` WHERE `group` = $group AND hidden != 'y' ORDER BY position = '' ASC, position ASC, id ASC");   
		while ($row = mysql_fetch_array($result)) 
			{
				$tree[] = array('name' => $row['menu'], 'id' => $row['id'], 'pid' => $row['pid'], 'page' => $row['page']);
			}
		function get_tree($tree, $pid)
			{
				$html = '';
				foreach ($tree as $row)
				{
					if ($row['pid'] == $pid)
					{
						$html .= '<li><a href="'.$row['page'].'">'.$row['name'].'</a>';
						$html .= '' . get_tree($tree, $row['id']);
						$html .= '</li>' . "\n";
					}
				}
				return $html ? '<ul>'.$html.'</ul>' . "\n" : '';
			}
		echo get_tree($tree, 0);
	}
Собственно вот.. приделал к ней только идентификатор меню $group (Меню то не одно может быть). Полез в админку, добавил второе меню, вставил вывод в шаблон и тут на тебе! Вывожу.. menu(1); - выводится, зову её второй раз для второго меню menu(2); - Cannot redeclare get_tree(). Ну и в чём тогда она функция, если её больше одного раза не вызвать? С ней что-то можно сделать? Всё-таки жалко. Маленькая, быстрая.

Дерево - списки смежности, если что.. Или как там оно называется с id и pid
 

Redjik

Джедай-мастер
Ой - все равно говнокод, убери функцию getTree и сделай выводы через echo
 

VANHALEN

Новичок
Ой - все равно говнокод, убери функцию getTree и сделай выводы через echo
Ааа блин, я ща голову сломаю чувствую.. Наверное пойду другую искать..
Очень информативно :) Я не профессор. Ну убрал я функцию и что мне делать в том месте, где она сама себя вызывает?
 

Redjik

Джедай-мастер
А, теперь увидел, она у тебя рекурсивная, ну вынеси get_tree ЗА пределы функции menu, все остальное оставь.
 

VANHALEN

Новичок
Я наверне тупой... Я только учусь
PHP:
function menu($group)	
	{
		$result = mysql_query("SELECT * FROM `menu` WHERE `group` = $group AND hidden != 'y' ORDER BY position = '' ASC, position ASC, id ASC");   
		while ($row = mysql_fetch_array($result)) 
			{
				$tree[] = array('name' => $row['menu'], 'id' => $row['id'], 'pid' => $row['pid'], 'page' => $row['page']);
			}
	}	
	
	function get_tree($tree, $pid)
			{
				$html = '';
				foreach ($tree as $row)
				{
					if ($row['pid'] == $pid)
					{
						$html .= '<li><a href="'.$row['page'].'">'.$row['name'].'</a>';
						$html .= '' . get_tree($tree, $row['id']);
						$html .= '</li>' . "\n";
					}
				}
				return $html ? '<ul>'.$html.'</ul>' . "\n" : '';
			}
		echo get_tree($tree, 0);
И чё? Теперь массив $tree доступен только внутри функии menu() и get_tree() естественно ничего не получает
 

VANHALEN

Новичок
Всё, извиняюсь.. Я дерево выводил не внутри функции menu();
PHP:
function menu($group)	
	{
		$result = mysql_query("SELECT * FROM `menu` WHERE `group` = $group AND hidden != 'y' ORDER BY position = '' ASC, position ASC, id ASC");   
		while ($row = mysql_fetch_array($result)) 
			{
				$tree[] = array('name' => $row['menu'], 'id' => $row['id'], 'pid' => $row['pid'], 'page' => $row['page']);
			}
			echo get_tree($tree, 0);
	}	
function get_tree($tree, $pid)
	{
		$html = '';
		foreach ($tree as $row)
		{
			if ($row['pid'] == $pid)
			{
				$html .= '<li><a href="'.$row['page'].'">'.$row['name'].'</a>';
				$html .= '' . get_tree($tree, $row['id']);
				$html .= '</li>' . "\n";
			}
		}
		return $html ? '<ul>'.$html.'</ul>' . "\n" : '';
	}
Так работает.. Но мне тепрь этот говнокод тоже не нравится, потому что я нихера не понимаю синтаксиса вывода..
 

Redjik

Джедай-мастер
По поводу тупой - не знаю.
Ты ленивый и не учишься.

Мне проще дать тебе ответ и дальше уже игнорировать твои посты.
Разобраться что делает этот код можно за 5 минут, но ведь лень же, ага...

PHP:
function menu($group)
{
    $result = mysql_query("SELECT * FROM `menu` WHERE `group` = $group AND hidden != 'y' ORDER BY position = '' ASC, position ASC, id ASC");
    while ($row = mysql_fetch_array($result))
    {
        $tree[] = array('name' => $row['menu'], 'id' => $row['id'], 'pid' => $row['pid'], 'page' => $row['page']);
    }

    echo get_tree($tree, 0);
}

function get_tree($tree, $pid)
{
    $html = '';
    foreach ($tree as $row)
    {
        if ($row['pid'] == $pid)
        {
            $html .= '<li><a href="'.$row['page'].'">'.$row['name'].'</a>';
            $html .= '' . get_tree($tree, $row['id']);
            $html .= '</li>' . "\n";
        }
    }
    return $html ? '<ul>'.$html.'</ul>' . "\n" : '';
}
 

VANHALEN

Новичок
Ты ленивый и не учишься.
Так это.. я вообще то сам сделал.. На минуту раньше тебя.. Ну подсказал, спасибо..
Это ты пока ответ писал наверное, я сам себя и поправил.
Интересно, если бы я не учился, чё бы я сейчас вообще на этом форуме делал?
 

WMix

герр M:)ller
Партнер клуба
PHP:
// модель
function menu($group)
{
...
return $tree;
}
// view-helper
function get_tree($tree, $pid=0){}
// view и контроллер разделишь сам
echo get_tree(menu($group));
только имена функциям яб поизменял
 

KorP

Новичок
я про лень соглашусь с Redjik, тут если форум покурить, вариантов 5 вывода древовидного меню, уже в готовом виде имеется
 
Сверху