Recursive Menu Listing

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
User avatar
kendall
Forum Regular
Posts: 852
Joined: Tue Jul 30, 2002 10:21 am
Location: Trinidad, West Indies
Contact:

Recursive Menu Listing

Post by kendall »

Hey,

I have a menu structure that is put out into an array as follows

Code: Select all

$menus_array['trinidad'] = array("name"=>'Cara Suites Trinidad',
		 "id"=>'1000',
		 "link"=>'/trinidad.php?contentid=1000',
		 "contentid"=>'1000',
		 "parentid"=>'0',
		 "filename"=>'1000.html',
		 "submenus"=>array(
1=> array("name"=>'Rooms',
		 "id"=>'71012',
		 "link"=>'/trinidad.php?contentid=6016',
		 "contentid"=>'6016',
		 "parentid"=>'1000',
		 "filename"=>'6016.html',
		 "submenus"=>array(1=> array("name"=>'One Room',
		 "id"=>'11415',
		 "link"=>'/trinidad.php?contentid=1300',
		 "contentid"=>'1300',
		 "parentid"=>'71012',
		 "filename"=>'1300.html'
		)
		)
),3=> array("name"=>'Dining',
		 "id"=>'91511',
		 "link"=>'/trinidad.php?contentid=6019',
		 "contentid"=>'6019',
		 "parentid"=>'1000',
		 "filename"=>'6019.html',
		 "submenus"=>array(1=> array("name"=>'Breakfast Menu',
		 "id"=>'15051',
		 "link"=>'/trinidad.php?contentid=6020',
		 "contentid"=>'6020',
		 "parentid"=>'91511',
		 "filename"=>'6020.html',
		 "submenus"=>array(1=> array("name"=>'Test Menu',
		 "id"=>'51532',
		 "link"=>'/trinidad.php?contentid=6004',
		 "contentid"=>'6004',
		 "parentid"=>'15051',
		 "filename"=>'6004.html',
		 "submenus"=>array(1=> array("name"=>'4th Test Document',
		 "id"=>'51002',
		 "link"=>'/trinidad.php?contentid=30022',
		 "contentid"=>'30022',
		 "parentid"=>'51532',
		 "filename"=>'30022.html',
		 "submenus"=>array(1=> array("name"=>'5th Level',
		 "id"=>'11127',
		 "link"=>'/trinidad.php?contentid=4440',
		 "contentid"=>'4440',
		 "parentid"=>'51002',
		 "filename"=>'4440.html'
		)
		)

		)
		)
),2=> array("name"=>'Another Menu',
		 "id"=>'14155',
		 "link"=>'4005.html',
		 "contentid"=>'',
		 "parentid"=>'15051',
		 "filename"=>''
		)
		)

		)
		)
),4=> array("name"=>'Leisure Activities',
		 "id"=>'75131',
		 "link"=>'/trinidad.php?contentid=6018',
		 "contentid"=>'6018',
		 "parentid"=>'1000',
		 "filename"=>'6018.html',
		 "submenus"=>array(1=> array("name"=>'Some Document',
		 "id"=>'56852',
		 "link"=>'5555.html',
		 "contentid"=>'',
		 "parentid"=>'75131',
		 "filename"=>''
		)
		)
),6=> array("name"=>'Conferencing and Events',
		 "id"=>'19531',
		 "link"=>'/trinidad.php?contentid=6017',
		 "contentid"=>'6017',
		 "parentid"=>'1000',
		 "filename"=>'6017.html'
		))

		);
I am trying to do a breadcrumb using the following function

Code: Select all

function getMenus($subMenuItems,$section = false,$parent = false,$id = false,$depth=0){
	$menus = false;
	if($section && @array_key_exists($section,$subMenuItems))
		 $subMenuItems = array(0=>$subMenuItems[$section]);
	foreach ($subMenuItems as $key => $menuItem){
		if(!is_integer($key))
			$section = $key;
		$menus[] = array($menuItem['name'],$menuItem['id'],$menuItem['link'],$menuItem['contentid'],$menuItem['parentid'],$depth,$section,$menuItem['filename']);
		if($menuItem['parentid'] === $parent)
			continue;
		elseif($id && ($menuItem['id'] == $id))
			return $menus;
		elseif(@array_key_exists('submenus',$menuItem))
			$menus = @array_merge($menus,getMenus($menuItem['submenus'],$section,$parent,$id,$depth+1));
	}
	return $menus;
}

then i use the following process to get the breadcrumbs

Code: Select all

if($section){
	$output_menus = getMenus($menus_array,$section,$parent,$menuid);
	for($i=0;$i<count($output_menus);$i++){
		if($output_menus[$i][4] == 0 || $menuid == $output_menus[$i][1] || $parent == $output_menus[$i][1] || $output_menus[$i][5] <( $depth - $output_menus[$i][5])){
			print '<a href="'.$output_menus[$i][2].'">'.strtolower($output_menus[$i][0]).'</a>';
			if($output_menus[$i][1] == $menuid)
				break;	
			if($i < count($output_menus)-1)
				print "&nbsp;<strong>&raquo;</strong>&nbsp;";
		}
	}
}
but it breaks along the line when u get to a deeper level...
can anyone give me some insights here as to how to structure the function?

Kendall
User avatar
anjanesh
DevNet Resident
Posts: 1679
Joined: Sat Dec 06, 2003 9:52 pm
Location: Mumbai, India

Post by anjanesh »

Did you know that Dynarch's DHTML Menuis now linkware-free ?
Post Reply