con una función recursiva, algo así
   Código PHP:
    
//RECURSIVO:
    function getPrivilegios(connection $c,recordset $priv, $level,$id_usuario,$id_empresa){
        $event='';
        $class='privilegio';
        //verificando existencia de nodos:
        $recnode = $c->pg_elemento_menu->doQuery($c, new criteria(sqlEQUAL,$c->pg_elemento_menu->id_padre,$priv->id_elemento_menu))->orderBy($c->pg_elemento_menu->def_order)->orderBy($c->pg_elemento_menu->nombre)->doSelect();
        if($recnode){
            if($recnode->getNumRows()!=0){
                if($level==20 || $level==40){
                    $display="display:none;";
                    
                    $sl=($level==20) ? '_p':'_p2';
                    $class="menuprivilegio_close";
                }else{
                    $class="menuprivilegio";
                }
                $html.='<div style="'.$display.'" id="container'.$priv->id_elemento_menu.'">';
                $event='onclick="switch_priv(this,'.$priv->id_elemento_menu.');"';
                //$class="menuprivilegio";
                foreach($recnode as $e){//RECURSION:
                    $html.=getPrivilegios($c,$e,$level+20,$id_usuario,$id_empresa);
                }
                $html.='</div>';
            }
        }
        //leer los privilegiso del usuario por la empresa:
        $recu=$c->pg_menu_usuario->doSelect($c,new criteria(sqlAND,array(
            new criteria(sqlEQUAL,$c->pg_menu_usuario->id_usuario,$id_usuario),
            new criteria(sqlEQUAL,$c->pg_menu_usuario->id_empresa,"'".$id_empresa."'"),            
            new criteria(sqlEQUAL,$c->pg_menu_usuario->id_elemento_menu,$priv->id_elemento_menu)
        )));
//...
return $html;
}