For anyone else interested, I've been working with emagdnim to get an easy solution.
The best one found was using output buffering in the header.php file. In this way, we can render multiple menus using the wp_nav_menu(), but using output buffering we can break it up into pieces, and move those pieces around.
Here is the significant code (i.e. updated portion) for bottom-menu.php:
........
<?php /* Our navigation menu. */ ?>
<?php
if(wp_emember_is_member_logged_in()){
wp_nav_menu( array( 'menu' => 'normal-menu', 'menu_class' => 'sf-menu' ) );
/** CUSTOM CODE ADDITION **/
//connect to database
$link = mysql_connect("localhost", "[USERNAME]", "[PASSWORD]") or die("Oops! Please wait a few seconds and try again");
//connect to table
mysql_select_db("[TABLE NAME]") or die(mysql_error());
//search table
$result = mysql_query("SELECT * FROM `wp_wp_eMember_membership_tbl` ORDER BY `alias` ASC");
$array = array();
//while there are still rows in the table we haven't been to...
while ($row = mysql_fetch_array($result)){
//clean up the "alias" so it becomes the name of the menu
$alias = strtolower(str_replace(' ','-',$row['alias']));
//now this can be accessed as "$array[X]" to get the name of the menu.
if ($alias == 'admin'){
$alias = 'admin-menu';
}
$array[$row['id']] = $alias;
}
//done is a way to check if anything is found, if not a default menu is loaded
echo '{BREAK}';
$done = 0;
$ids = array_keys($array);
$info2 = wp_eMember_get_user_details("more_membership_levels");
if (strstr($info2,',')){
$moreMemberLevels = explode(',',$info2);
}elseif ($info2 != ''){
$moreMemberLevels[0] = $info2;
}
//go through each ID/menu possibility
for ($i = 0; $i < count($ids); $i++){
if ((wp_emember_is_member_logged_in($ids[$i])) || ((is_array($moreMemberLevels)) && ((in_array($ids[$i],$moreMemberLevels))))){
$done++;
//add the mneu to wp
/** UNCOMMENT THIS TO IMPLEMENT LOOKUP VERIFICATION BEFORE ADDING A MENU **/
/*
echo 'Searching for '.$array[$ids[$i]].'...';
$res = mysql_query("SELECT * FROM `wp_posts` WHERE `post_type`='nav_menu_item' AND `post_name`='{$array[$ids[$i]]}' LIMIT 1");
if (mysql_num_rows($res) == 1){*/
if ($array[$ids[$i]] != 'free'){
/** UNCOMMENT THIS TO DEBUG **/
//echo 'Adding '.$array[$ids[$i]].' to menu...<br />';
wp_nav_menu(array('menu'=>$array[$ids[$i]], 'menu_class'=>'sf-menu'));
}
}
}
echo ' {BREAK}';
/** END CUSTOM CODE ADDITION **/
}else{
wp_nav_menu( array( 'menu' => 'normal-visitor-menu', 'menu_class' => 'sf-menu' ) );
}
and the updated code for header.php (which loads bottom-menu.php)
....
<div id="page" class="hfeed">
<?php /* ======== BOTTOM MENU ======== */
ob_start();
get_template_part('bottom','menu');
$bm = ob_get_clean();
$bm_array = explode('{BREAK}',$bm);
$bm_Top = $bm_array[0];
$bm_Move = strip_tags($bm_array[1],'<li><br /><br><font><b><i><u><em><strong><a>');
$bm_End = $bm_array[2];
$bottomMenu = str_replace('My Menu Item</a></li>', 'My New Menu Item</a>
<ul class="sub-menu">'.$bm_Move.'</ul>
</li>',$bm_Top).$bm_End;
ob_end_clean();
echo $bottomMenu;
//echo '*****'.$bm_Move.'*****';
?>
<div id="main">
Additional Information / Summary of Technique
This method takes one of two general menus and adds elements to it based on what should be loaded for each membership style. The "elements" are full menus created by wp_nav_manu(), but only one item. The names of the menus are also the names of the membership levels but with hyphens instead of spaces and all lowercase. By doing this, we do not need another table linking the seemingly arbitrary membership level ID with the name of the menu - you simply name the menus/memberships based on this system so it knows what to look for.
Furthermore, each added "menu" is actually a menu with only one, single menu item with the <ul></ul> tags removed so as to nest them into a sub-menu <ul> below the desired parent element.
After it is all said and done, we were able to use the wp menu system to dynamically display an infinite possibility of sub-menu items based on their membership level(s) and additional membership levels.