You make database like this.
ID    NAME     PARENT
0     Cars     -1
1     Foods    -1
2     Ford      0
3     Honda     0
4     Toyota    0
5     Pasta     1
6     Pizza     1
...
You query them all up and put it in an array.
$Menus = array();
// In a read MySQL loop
$Menus[$i]['ID']
$Menus[$i]['NAME']
$Menus[$i]['PARENT']
// Sorry, lazy to write. I think you know what I mean.
Then you loop all menu looking for PARENT == -1. Generate all UL and IL then sub it with another nested menu.
You can simply create a function like this.
var $MenuLevelClass = array("menulist");
 
function CreateMenu($Menus, $Tab = 0, $Parent = -1, $Level = 0) {
    global $MenuLevelClass;
     
    $CatClass  = ($Level != 0) ? '' : ' class="catmenu"';
     $MenuClass = $MenuLevelClass[$Level];
     if ($MenuClass != '')
         $MenuClass = ' class="'.$MenuClass.'"';
      
     $TabCount = $Level + $Tab;
     $TabUL    = "";
     for ($t = 0; $t < $TabCount; $t++)
         $TabUL = $TabUL."\t";
     $TabLI = $TabUL."\t";
      
?>
<?=$TabUL?><ul<?=$CatClass?>>
<?php
     
    $MenuCount = count($Menus);
    for ($m = 0; $m < $MenuCount; $m++) {
        $Menu = $Menu[$m];
        $ID   = $Menu['ID'];
        if ($ID != $Parent)
            continue;
     
?>
<?=$TabLI?><li<?=$MenuClass?>><?=$Menu['Name']?><?=CreateMenu($Menus, $Tab + 1, $ID, $Level + 1)?></li>
<?php
     
?>
<?=$TabUL?></ul>
<?php
     
    }
}
And to use it just run 'CreateMenu($Menus);' or 'CreateMenu($Menus, $PrefixTabCount);'.
CreateMenu will recursively create the nested menu for you.
I have not test it so you may have to adjust it.
Hope this helps.