Вывод древовидной структуры с тремя уровнями вложенности без рекурсии

Ekaterina

Новичок
Вывод древовидной структуры с тремя уровнями вложенности без рекурсии

Нужно вывести в раскрывающемся списке каталог товаров, уровней вложенности три:
Делаю так, но запуталась с вложенностью циклов, помогите, плиз:
PHP:
<select name="sld_list_cat" width="200" tabindex="2">
     <?
        $parent = ''; 
        $cat_prev_id = '';
        foreach ($sld_all_category as $name) {?>
        
        <?      
        
            if ($name['sld_cat_parent_id'] == 0) {?>
        	
        	<option  value = "<?echo $name['sld_cat_id']?>" <?//echo $select;?> ><? echo $name['sld_cat_title'];?></option> 
        	
         <? } else {
            $cat_prev_id =  $name['sld_cat_id'];
            
            foreach ($sld_all_category as $name2) {
            	
               if ($cat_prev_id = $name2['sld_cat_parent_id'] ) { ?>
               
                  <option  value = "<?echo $name2['sld_cat_id']?>" <?//echo $select;?> >&nbsp&nbsp&nbsp<? echo $name2['sld_cat_title'];?></option>             	
             <? } else {
               $cat_prev_id2 = $name2['sld_cat_id'];
                
               foreach ($sld_all_category as $name3) {
                  
                  if ($cat_prev_id2 = $name3['sld_cat_parent_id'] ) {?>
               
                     <option  value = "<?echo $name3['sld_cat_id']?>" <?//echo $select;?> >&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<? echo $name3['sld_cat_title'];?></option>             	
             <?   } 	  	
               	
               }}//foreach3
               
               ?>
            	
          <?}}//foreach2?>
  
        
         <? }//foreach?>
        

      </select>
 

soines

Новичок
Скопируй этот код в какую-нибудь нормальную IDE, она подсветит тебе ошибки синтаксиса.
 

Ekaterina

Новичок
этот код работает, но выводит кучу зацикленных записей, что-то в циклах
 

soines

Новичок
Посмотри внимательно на три цикла foreach, ты в них перебираешь один и тот же массив.
 

partizan

Новичок
Я сначала научился все подряд с рекурсией делать, а уже потом - обходиться без нее, там где можно
 

Ekaterina

Новичок
Всем спасибо, я разобралась:
PHP:
<?  foreach ($cats as $cat)
      {    
      	  if ($cat_id == $cat->ID)
      	    $select = 'selected';
      	  else
      	     $select = '';         	
      	      
           if ($cat->menu_item_parent==0) {?>
              
              <option  value = "<?echo $cat->ID;?>" <?echo $select;?> ><? echo $cat->title;?></option>	   
       <?       foreach ($cats as $cat2) {?>
       
               <?    if ($cat_id == $cat2->ID)
      	                $select = 'selected';
      	             else
      	                $select = '';?>
       	      
                    <? if ($cat2->menu_item_parent==$cat->ID) {?>
                    
                         
                          <option  value = "<?echo $cat2->ID;?>" <?echo $select;?>>&nbsp;&nbsp;&nbsp;<? echo $cat2->title;?></option>             	
                          
                         <? foreach ($cats as $cat3) {
                         	
                         	   if ($cat_id == $cat3->ID)
      	                          $select = 'selected';
      	                        else
      	                           $select = '';
                         	
                         	   if ($cat3->menu_item_parent==$cat2->ID) { ?>
                                  <option  value = "<?echo $cat3->ID;?>" <?echo $select;?> >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<? echo $cat3->title;?></option>             	
                    <?}?>
                 <?}?>
             <? }?>
            <?}?>
         <?}?>
      <?}?>
 

partizan

Новичок
PHP:
$childs = array();
	foreach ($cats as $cat)
	{
		if (empty($childs[$cat->menu_item_parent])) 
		{
			$childs[$cat->menu_item_parent] = array();
		}
		
		$childs[$cat->menu_item_parent][] = $cat;
	}
	
	recursion($childs[0]);
	
	function recursion($cats, $prefix = '')
	{
		global $cat_id, $childs ;
		foreach ($cats as $cat)
		{
			if ($cat_id == $cat->ID)
				$select = 'selected';
			else
				$select = '';
				
			echo "<option value='{$cat->ID}' $select>$prefix{$cat->title}</option>";
			
			if (!empty($childs[$cat->ID])) 
			{
				recursion($childs[$cat->ID], $prefix . '&nbsp;&nbsp;&nbsp');
			}
		}
	}
 

Ekaterina

Новичок
Partizan, спасибо большое, разобралась с Вашим кодом. Правда, у меня заработало, когда я еще объявила
PHP:
global $childs ;
$childs = array(); 
.....
и далее как у Вас
потому что childs не был доступен внутри функции.

И еще такой вопрос, где можно прочитать про такой синтаксис:
PHP:
echo "<option value='{$cat->ID}' $select>$prefix{$cat->title}</option>";
Как например, в вышеуказанной конструкции вместо переменной $select мне написать такой код
PHP:
 <?if ((!empty($error)) && $_POST['sld_list_page'] == $rec->ID) echo 'selected';?>
-~{}~ 06.07.10 12:15:

Кажется сама разобралась: {} скобки используются, чтобы точно определить конец имени переменной, так как когда интерпретатор встречает знак $ , он пытается захватить как можно больше символов в качестве имени переменной , следующих после $.

Единственное чего не могу понять в
PHP:
echo "<option value='{$cat->ID}' $select>$prefix{$cat->title}</option>";
Каким образом в части value='{$cat->ID}' выводится значение $cat->ID, если оно заключено в одинарные кавычки, а в одинарных кавычках как написано в документации выводится имя переменной, а не ее значение.
 

partizan

Новичок
Строка заключена в двойные кавычки:
PHP:
echo "<option ... </option>";
а одинарные кавычки внутри - это просто часть строки, которая выводиться как и остальные символы.
 

Ekaterina

Новичок
Автор оригинала: partizan
Строка заключена в двойные кавычки:
PHP:
echo "<option ... </option>";
а одинарные кавычки внутри - это просто часть строки, которая выводиться как и остальные символы.
Спасибо за ответ! То есть одинарные кавычки в данном случае можно и не писать? в чем их смысл?
 

partizan

Новичок
Эти кавычки - прочто часть строки, которая выводится:
PHP:
<option value='123' ...
Если их не напсать - то и в выводи их просто не будет

PHP:
<option value=123 ...
Можно и без них, но в html вроде как принято значения атрибутов в кавычки брать
 

john.brown

просто кулибин
partizan
Принято, при том в двойные. По этому лучше с одинарными не эксперментировать. Понятно, что в 99,9% работает, но тем не менее, может получится очень долго отлавливаемый глюк...
 

Ekaterina

Новичок
Можно и без них, но в html вроде как принято значения атрибутов в кавычки брать
Автор оригинала: john.brown
partizan
Принято, при том в двойные. По этому лучше с одинарными не эксперментировать. Понятно, что в 99,9% работает, но тем не менее, может получится очень долго отлавливаемый глюк...
partizan и john.brown, спасибо за ответы, теперь все окончательно стало понятно.
 
Сверху