Выпадающее меню , Рекурсивная функция

ShadowDancerII

Новичок
Выпадающее меню , Рекурсивная функция

Добрый всем денек!

Есть такая задача:
Нужно построить выпадающее меню разделов вида
<Option>Родительский раздел</option>
<Option>Родительский раздел/подраздел/</option>
итд пока подразделы не кончатся.

самое простое решение Рекурсия. примеры с построением дерева каталогов рассматриваются почти везде, а как сделать меню.
PHP:
function menu($get_all_razdels, $id = 0,  $prefix = '') { 
    $out = $prefix.'--'; 
    foreach ($get_all_razdels as $key => $value){ 
           if($value['parent_id'] == $id){ 
                    $out .= '<option value="$value[id]">'.$value['name'].'</option>'; 
                    $out = get_tree($get_all_razdels, $key, $out); 
           }
		
    } 
    $out .='$value[name]|'; 
    return str_replace('<ul></ul>','',$out); 
} 
 
$array = array ( 
  1 => array ('id' => '1', 'parent_id' => '0', 'name' => 'Родительский раздел 1' ), 
  2 => array ('id' => '2', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  3 => array ('id' => '3', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  4 => array ('id' => '4', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  5 => array ('id' => '5', 'parent_id' => '2', 'name' => 'Дочерний раздел'), 
6 => array ('id' =>'13', 'parent_id' => '4', 'name' => 'Дочерний раздел'), 
7 => array ('id' =>'14', 'parent_id' => '5', 'name' => 'Дочерний раздел'), 
8 => array ('id' =>'15', 'parent_id' => '5', 'name' => 'Дочерний раздел'), 
9 => array ('id' =>'16', 'parent_id' => '5', 'name' => 'Дочерний раздел'), 
10 => array ('id' =>'16', 'parent_id' => '0', 'name' => 'Родительский раздел 2') 
); 
 
echo " <form action=\"\" method=\"get\">
<select name=\"12\">";
print menu($array,0,false); 
echo "</select>
</form>";
Буду очень благодарен ответившим!
 

Фанат

oncle terrible
Команда форума
а чем принципиально отличается дерево каталогов от меню?
html тегами?
может быть, тогда сначала попробовать без них, а потом добавить нужные?

Ты, кстати, представляешь себе, что хочешь получить? В виде html-кода, разумеется.
 

ShadowDancerII

Новичок
Да вот то что я хочу:


PHP:
<form action="//" method="get">
<select name="groupe">
<option value="1">Автоэмали</option>
<option value="2">Автоэмали/Мобихел</option>
<option value="3">Автоэмали/Садолин</option>
<option value="4">Автозапчасти</option>
<option value="5">Автозапчасти/Покрышки</option>
<option value="6">Автозапчасти/Литые диски</option>
</select>
</form>
Автозапчасти и автоэмали - это родительские группы. Мобихел и садолин являются подгруппами автоэмалей, а покрышки и литые диски подгруппами Автозапчастей

У этих погрупп так же может быть множество подгрупп.
 

Фанат

oncle terrible
Команда форума
то есть, к примеру вывода дерева каталогов надо всего лишь добавить теги option
я правильно понимаю?
 

ShadowDancerII

Новичок
Собственно да, но.
Надо же еще перед каждой подгруппой прописать родителей.
Я пробовал вчера дома просидел целый вечер.
 

ShadowDancerII

Новичок
РОДИТЕЛЕЙ Ведь подгрупп может быть множество подгрупп
тоесть само по себе дерево может быть бесконечно

тоесть может быть главная группа имеющая parent_id 0
у этой группы будет подгруппа, а у подгруппы еще две подгруппы

в результате при выводе последней подгруппы мы получаем 2-х родителей.
 

Фанат

oncle terrible
Команда форума
тьфу.
ты имеешь в виду в строчку, а не в столбик.
и в примерах вывода каталогов нету вывода полного пути?

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

ShadowDancerII

Новичок
бьюсь который день не получается ((

что делаю не так?

PHP:
<?php 

function menu($get_all_razdels, $id = 0) {
     
	foreach ($get_all_razdels as $key => $value){
         
		   if($value['parent_id'] == $id){
                    $out .= 'РОД'.$value['name'].'<br>';
                   
           }else{
		   
		   $newid = $value['id'];
		   menu($array, $newid);
		   }
        
    }

    return $out;
} 
 
$array = array ( 
  1 => array ('id' => '1', 'parent_id' => '0', 'name' => 'Родительский раздел 1' ), 
  2 => array ('id' => '2', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  3 => array ('id' => '3', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  4 => array ('id' => '4', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  5 => array ('id' => '5', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
6 => array ('id' =>'13', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
7 => array ('id' =>'14', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
8 => array ('id' =>'15', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
9 => array ('id' =>'16', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
10 => array ('id' =>'16', 'parent_id' => '0', 'name' => 'Родительский раздел 2') 
); 
 
#echo " <form action=\"\" method=\"get\">
#<select name=\"12\">";
print menu($array,0); 
#echo "</select>
#</form>";
?>
 

ShadowDancerII

Новичок
Автор оригинала: SiMM
> бьюсь который день не получается ((
PHP FAQ: Ничего не работает! Что делать???. Сообщения об ошибках PHP. для начала.
;) Очень содержательный ответ!
А что самое главное в тему ) Огромное спасибо.. только помоему я просил не ссылку на FAQ а помощь в поиске ошибки. Не все же такие одаренные как например Вы SiMM)

-~{}~ 24.09.05 11:52:

Мне кажется это массив из которого я пытаюсь постороить спиок
 

SiMM

Новичок
Значит так. Ты сейчас идёшь и ЧИТАЕШЬ FAQ, после чего исправляешь явные ляпы, которые видны ДАЖЕ PHP.
После этого протираешь глазки и думаешь, почему дитё вдруг оказалось СВОИМ родителем, и убираешь клоны.

> Не все же такие одаренные как например Вы SiMM
А что, вы даже читать не умеете? Или по ссылкам ходить?
 

ShadowDancerII

Новичок
Вот :
PHP:
function menu($get_all_razdels, $id) {
     
	foreach ($get_all_razdels as $key => $value){
		   if($value['parent_id'] == $id){
                    $out = "$value[name]<br>";
					echo "$out";
                   
           }else{
		   
		   $newid = $value['id'];
		   menu($array, $newid);
		   }
        
    }


} 
 
$array = array ( 
  1 => array ('id' => '1', 'parent_id' => '0', 'name' => 'Родительский раздел 1' ), 
  2 => array ('id' => '2', 'parent_id' => '0', 'name' => 'Родительский раздел 2'), 
  3 => array ('id' => '3', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  4 => array ('id' => '4', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
  5 => array ('id' => '5', 'parent_id' => '1', 'name' => 'Дочерний раздел'), 
6 => array ('id' =>'13', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
7 => array ('id' =>'14', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
8 => array ('id' =>'15', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
9 => array ('id' =>'16', 'parent_id' => '16', 'name' => 'Дочерний раздел'), 
10 => array ('id' =>'16', 'parent_id' => '0', 'name' => 'Родительский раздел 3') 
); 
 

menu($array,"0");
что не так ?
3 родителя остальные дочки
 

SiMM

Новичок
Почему я тебя должен уговаривать?
PHP Notice: Undefined variable: array in ... on line ...
и как следствие
PHP Warning: Invalid argument supplied for foreach() in ... on line ...
Неужели нельзя было УВИДЕТЬ эти ошибки самостоятельно, после прочтения материала по ссылке и следования рекомендациям?
+ bonus - результаты рекурсивного вызова у тебя уходят в никуда.
 

ShadowDancerII

Новичок
Да просто PHP Notice: Undefined variable: array in ... on line ...
у меня не выводятся.. и я только что об этом узнал FAQ читаю и очень внимательно а почему рекурсия уходит в никуда ?
 

SiMM

Новичок
> у меня не выводятся..
Вот именно поэтому тебе и дали ссылку.

> а почему рекурсия уходит в никуда ?
Не рекурсия уходит в никуда, а её результат.
PHP:
menu($array, $newid);
 

ShadowDancerII

Новичок
Ну а почему же в первом цикле $array проходит а при вызове рекурсии не проходит ?
 

SiMM

Новичок
> Ну а почему же в первом цикле $array проходит
Где это он проходит?
[m]language.variables.scope[/m]
 
Сверху