Yo tengo algo parecido a lo que necesitas aqui el código...
Es parte de una clase... con algunos cambios y quizás te funcione...
Código PHP:
Ver originalpublic function generarMenu()
{ // Inicio Carga de Categorias
$config = Config::singleton();
$tabla = $config->get('tabla');
$campoId = $config->get('campoId');
$categoria = $config->get('categoria');
$relacion = $config->get('relacion');
$padre = 0;
$prefijo = '-';
$this->arbolJerarquico($tabla,$campoId,$categoria,$relacion,$padre,$prefijo);
$nivelAnterior = 0;
// INTERACTIVIDAD DEL MENU //
$menuHTML = '<div id="treecontrol">'."\n";
$menuHTML .='<a title="Collapsar Menu" href="#">Colapsar</a> |' . "\n";
$menuHTML .='<a title="Expandir Menu" href="#"> Expandir</a> |' . "\n";
$menuHTML .='<a title="Alternar Menu" href="#"> Alternar</a>' . "\n";
$menuHTML .='</div>' . "\n";
$menuHTML .="\n\n<ul id='gray' class='treeview-gray'>\n";
foreach($this->categorias as $valor)
{ $nivel = $this->calcularNivel($valor['prefijo'],$prefijo);
switch($valor['padre'])
{ case 'Si':
if($nivel==$nivelAnterior )
{ $menuHTML .='<li class="closed"><a href="index.php?mdl=catalogo&ctr=Ver&acc=categoria&id=' . $valor['id'] . '" >' . $valor['categoria'] . "</a>\n"; }
elseif($nivel>$nivelAnterior)
{ $menuHTML .='<ul><li class="closed"><a href="index.php?mdl=catalogo&ctr=Ver&acc=categoria&id=' . $valor['id'] . '" >' . $valor['categoria'] . "</a>\n"; }
else
{ $menuHTML .='</ul></li><li class="closed"><a href="index.php?mdl=catalogo&ctr=Ver&acc=categoria&id=' . $valor['id'] . '">' . $valor['categoria'] . "</a>\n"; }
break;
case 'No':
if($nivel==$nivelAnterior)
{ $menuHTML .='<li><a href="index.php?mdl=catalogo&ctr=Ver&acc=categoria&id=' . $valor['id'] . '">' . $valor['categoria'] . '</a></li>' . "\n"; }
elseif($nivel<$nivelAnterior)
{ $cierroUl = str_repeat('</ul></li>',$nivelAnterior-$nivel); $menuHTML .=$cierroUl.'<li><a href="index.php?mdl=catalogo&ctr=Ver&acc=categoria&id=' . $valor['id'] . '" >' . $valor['categoria'] . '</a></li>' . "\n"; }
else
{ $menuHTML .='<ul><li><a href="index.php?mdl=catalogo&ctr=Ver&acc=categoria&id=' . $valor['id'] . '">' . $valor['categoria'] . '</a></li>' . "\n"; }
break;
}
$nivelAnterior = $nivel;
}
$menuHTML .="</ul>\n\n";
$fp = fopen('../opet/menu/menuPublico.html' ,"w+"); echo $menuHTML;
}
public function arbolJerarquico($tabla,$campoId,$categoria,$relacion,$padre,$prefijo='-')
{ $objCategorias = new CategoriasModelo();
$categorias = $objCategorias->generarArbolCategorias($tabla,$relacion,$padre);
if($categorias)
{ $filas = $categorias->fetch_object();
while($filas)
{ $this->categorias[]['id'] = $filas->$campoId;
$cnt = count($this->categorias)-1; $this->categorias[$cnt]['prefijo'] = $prefijo;
$this->categorias[$cnt]['categoria'] = $filas->$categoria;
$this->categorias[$cnt]['padre'] = $filas->padre;
$this->arbolJerarquico($tabla,$campoId,$categoria,$relacion,$filas->$campoId, $prefijo . $prefijo);
$filas = $categorias->fetch_object();
}
}
}
Esta es mi tabla MySQL
Código SQL:
Ver originalCREATE TABLE `categorias` (
`idCategoria` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`nombreCategoria` VARCHAR(60) NOT NULL,
`idCategoriaPadre` SMALLINT(6) NULL DEFAULT '0' COMMENT 'Nos refleja si es hijo de una categoria o es padre(0).',
`imagenCategoria` VARCHAR(150) NULL DEFAULT NULL,
`padre` SET('No','Si') NOT NULL DEFAULT 'No',
`descripcionCategoria` VARCHAR(1000) NULL DEFAULT NULL,
PRIMARY KEY (`idCategoria`)
)