Как вывести из массива различные уровни вложенности?

fantazista

Новичок
Здравствуйте
У меня такой массив
Часть массива

PHP:
Array
(
    [197] => Array
        (
            [name] => service
            [cid] => 77
            [accesskey] => 
            [sid] => 0
            [org_url] => 0
            [st_map] => 0
            [link] => http://md/xalq/services/lang,az/
            [target] => _blank
        )

    [185] => Array
        (
            [name] => news
            [cid] => 67
            [accesskey] => 
            [sid] => 0
            [org_url] => 0
            [st_map] => 0
            [link] => http://md/xalq/news/lang,az/
            [target] => _blank
            [child] => Array
                (
                    [] => Array
                        (
                            [193] => Array
                                (
                                    [name] => news4
                                    [cid] => 75
                                    [accesskey] => 
                                    [sid] => 0
                                    [org_url] => 0
                                    [st_map] => 0
                                    [link] => http://md/xalq/news4/lang,az/
                                    [target] => _blank
                                    [child] => Array
                                        (
                                            [] => Array
                                                (
                                                    [194] => Array
                                                        (
                                                            [name] => news4_1
                                                            [cid] => 76
                                                            [accesskey] => 
                                                            [sid] => 0
                                                            [org_url] => 0
                                                            [st_map] => 0
                                                            [link] => http://md/xalq/news4_1/lang,az/
                                                            [target] => _blank
                                                        )

                                                )

                                        )

                                )

                            [192] => Array
                                (
                                    [name] => news3
                                    [cid] => 74
                                    [accesskey] => 
                                    [sid] => 0
                                    [org_url] => 0
                                    [st_map] => 0
                                    [link] => http://md/xalq/news3/lang,az/
                                    [target] => _blank
                                )

                            [191] => Array
                                (
                                    [name] => news2
                                    [cid] => 73
                                    [accesskey] => 
                                    [sid] => 0
                                    [org_url] => 0
                                    [st_map] => 0
                                    [link] => http://md/xalq/news2/lang,az/
                                    [target] => _blank
                                )

                            [190] => Array
                                (
                                    [name] => news1
                                    [cid] => 72
                                    [accesskey] => 
                                    [sid] => 0
                                    [org_url] => 0
                                    [st_map] => 0
                                    [link] => http://md/xalq/news1/lang,az/
                                    [target] => _blank
                                )

                        )

                )

        )


Нужно универсальным образом выводить навигацию в зависимости от родителя.
Со вторым уровнем вложенности проблем не возникает.
Делаю вот так.

PHP:
public function printSupMenu($structure, $query_url) {
		// print " \n SUB MENU STRUCTURE \n"; print_r($structure); print " \n ";
		
		$i=0;
		
	//	print $this->active_nav;
	//	print cmsApi::$url.'/'.$query_url;
		
		foreach ($structure as $item) {
			
			$is_current_page = (($item['link']==(cmsApi::$url.'/'.$query_url))? true: false);
			$is_parent_page  = $is_current_page;
				
			if ($is_current_page) {
				
				if ($item['child']) {
				
				foreach ($item['child'] as $subitem_container) {
					
					foreach ($subitem_container as $subitem) {
						
  $submenu = '<a href="'.$subitem['link'].'" title="" class="link visit"><span>'.$subitem['name'].'</span></a>';
						
						$category_list.='
							<li id="l'.($i+1).'">
							'.$submenu.'
						   </li>';
				 	    $i++;
				 	    
				 	    
				 	    if ($subitem['child']) { 
				 	   	
				 	   		foreach ($subitem['child'] as $subitem_two_conteiner) {
				 	    	
				 	  	 		foreach ($subitem_two_conteiner as $subitem_two) {
				 	    	
				 	   	
$submenu_two = '<a href="'.$subitem_two['link'].'" title="" class="link visit"><span>'.$subitem_two['name'].'</span></a>';
				 	   	
									$category_list_two.='
										<li id="l'.($i+1).'">
											'.$submenu_two.'
						 	   			 </li>';
				 	    			$i++; 
				 	   	
				 	  	 		}
				 	    
				 	  	    }
				 	  	
				 	   }
				 	    
					}
					
				 }
				 
				 $html = '<ul id="sub-nav">';
				 $html.= $category_list;
				 $html.='</ul>';
				 $html.='<ul id="sub-nav-two">';
				 $html.= $category_list_two;
				 $html.='</ul>';
				 
				} else {
					
					$html.='';
				}
				 
		    } else {
		    	
		    	
		    }
			
		}
		
    	return $html;
	}

Там внутри по третьему уровню тоже прохожусь (провверял)
Проблема в том когдая нахожусь во втором уровне не срабатывает проверка на url

$is_current_page = (($item['link']==(cmsApi::$url.'/'.$query_url))? true: false);


cmsApi::$url.'/'.$query_url - текущий url.

так как он проверяет линк родителя, а текущий линк отличается.
Как можно "универсальным" методом узнавать где на данный момент я нахожусь и кого скрипт должен выводить.

Допустим на примере того что я перехожу на news4. Как при этом вывести выше него, его самого вместе (news1 news2 news3) и того кто ему принадлежит (news4_1).
 

fantazista

Новичок
Вопрос был неккоректен. Может кто подсказать как действовать с такой функцией. Просто упростить ее.

PHP:
	public function printSupMenu($structure, $query_url) {
		
		// print " \n SUB MENU STRUCTURE \n"; print_r($structure); print " \n ";
		$i=0;
	    // print $this->active_nav;
		// print cmsApi::$url.'/'.$query_url;
		
		foreach ($structure as $item) {
			
			$is_current_page = (($item['link']==(cmsApi::$url.'/'.$query_url))? true: false);
				
			if ($is_current_page) {
				foreach ($item['child'] as $subitem_container) {
					foreach ($subitem_container as $subitem) {
                    	$submenu = '<a href="'.$subitem['link'].'" title="" class="link visit"><span>'.$subitem['name'].'</span></a>';
						$category_list.='
							<li id="l'.($i+1).'">
							'.$submenu.'
						   </li>';
				 	    $i++;
					}
				}
		    } else {
		    	
		    	if ($item['child']) {
		    		foreach ($item['child'] as $subitem_container) {
						foreach ($subitem_container as $subitem) {
							print_r($subitem);
							$is_current_page = (($subitem['link']==(cmsApi::$url.'/'.$query_url))? true: false);
							
							if ($is_current_page) {
								foreach ($item['child'] as $subitem_container) {
									foreach ($subitem_container as $subitem) {
                    					$submenu = '<a href="'.$subitem['link'].'" title="" class="link visit"><span>'.$subitem['name'].'</span></a>';
										$category_list.='
											<li id="l'.($i+1).'">
											'.$submenu.'
						   					</li>';
				 	    				$i++;
				 	    					if ($subitem['child']) { 
				 	   							foreach ($subitem['child'] as $subitem_two_conteiner) {
				 	  	 							foreach ($subitem_two_conteiner as $subitem_two) {
				 	   	 								$submenu_two = '<a href="'.$subitem_two['link'].'" title="" class="link visit"><span>'.$subitem_two['name'].'</span></a>';
														$category_list_two.='
															<li id="l'.($i+1).'">
																'.$submenu_two.'
						 	   						   	    </li>';
				 	    								$i++; 
				 	  	 							}
				 	  	    					}
				 	  						 }
									}
								}
								
							} else {
								print no;
							}
						}
		    		}
		    	}
		    }
		     	 $html = '<ul id="sub-nav">';
				 $html.= $category_list;
				 $html.='</ul>';
				 
				 $html.= '<ul id="sub-nav">';
				 $html.= $category_list_two;
				 $html.='</ul>';
		}
    	return $html;
	}
Работает, но не может же быть такого длинного решения. Это еще ее не полная версия. Может у массива будет 10 уровней вложенности.
Как можно универсализировать этот код. Или же в данном случае надо пересматривать логику выброса?
 

tf

крылья рулят
пчто то очень муторно, попробуй сново насмотреть на нужный вариант и передалать данные для более легкого отображения
+ зачем у тебя такая логика для отображения
PHP:
if ($is_current_page) {***} else {
и поменяй наконец
PHP:
    $category_list.='
        <li id="l'.($i+1).'">
            <a href="'.$subitem['link'].'" title="" class="link visit"><span>'.$subitem['name'].'</span></a>
        </li>';
 

fantazista

Новичок
tf
зачем у тебя такая логика для отображения
Проверяю каждый раз какой элемент массива является текущим url. И в зависимомти от этого знаю, что мне нужно выводить.
Это нужно переделать?
 

no_santa

Снегур
Я бы сделал бенчмаркинг, и если бы результаты оказались позитивными - не стал бы ничего менять.
 

scorpion-ds

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

fantazista

Новичок
scorpion-ds
Сегодня как раз пытался рекурсию применить. Но там пока один момент не получается(третий уровень не выводит, что то. На втором без проблем работает). Если не разбирусь напишу.
Есть момент того что возможно придется немного пересмотреть создание самого массива из бд. Мне сказали что может парент id какой нибудь вести и прослеживать путь кто кому принадлежит. Хотя рекурсия мне нравиться больше. С ней вроде бы уже все получилось.
Но почему то говорят, что это не совсем правильно. Ее надо вызывать когда уже друго выхода не существует.
Да текущий уровень запоминать надо. Когда допустим нахожусь на третьем то и его и вторую и первый уровень выводить должен.
Но первый уровень не проблема он в хедере выводится через отдельную функцию всегда. Через один перебор массива. А все остальные на странице категории только.
 

tz-lom

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