umpf .... non vedo la chiamata ricorsiva a me pare una funzione iterativa...
non ricorsiva...

tu carichi tutti i menu poi esegui una distinzione tra parent e children senza sperare i dati dalla struttura pincvipale.
dovresti fare 2 buffers 1 con i parent e 1 con i children.
Inoltre questa procedura si ferma al secondo livello di profondità in quanto non presenti le chiamate a se' stessa.

crea 2 nuovi metodo ... cosi' per testare

1- toHtml()
2- getMenu( $data , $level )

il metodo toHtml()
- carica i dati where id_parent==0
- converte il ris in array e passa l'array a getMenu( $roots , 0 ) ;

ol metodo getMenu($data,$level)
SE DATA != ARRAY() ==> CASO BASE => return "" ;

apre ul

scorre l'array $data

per ogni riga : esegue query di estrazione figli (come dicevo sopra where parent_id==$id)

converte le righe in array e richiama getMenu( $figli , ++$level )

concatena risultato

chiudi ul

ritorna stringa