Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732

    esplodere un albero costruito con il nested set algorithm

    dunque

    ho creato un bel database che mi rappresenta un albero, seguendo la guida che ho trovato qua:

    http://database.html.it/articoli/leg...-su-database/5

    tutto figo... visualizzo l'albero fino al figlio che mi interessa, inserisco, elimino...

    ho un problema però, se volessi stampare tutta la struttura dell'albero come faccio?

    pensavo di fare una cosa ricorsiva che esplode ed esplode ed esplode... ma visto che c'è sta gran figata di struttura, ci sarà un metodo più efficace no? cosa mi sono perso?

  2. #2
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732
    per la serie: si trova una soluzione subito dopo averla richiesta

    Codice PHP:
    function buildThree($root) {
       
    // retrieve the left and right value of the $root node
       
    $result mysql_query('SELECT sx, dx FROM personale '.
                              
    'WHERE id="'.$root.'";');
       
    $row mysql_fetch_array($result);

       
    // start with an empty $right stack
       
    $right = array();

       
    // now, retrieve all descendants of the $root node
       
    $result mysql_query('SELECT nome, sx, dx FROM personale '.
                              
    'WHERE sx BETWEEN '.$row['sx'].' AND '.
                              
    $row['dx'].' ORDER BY sx ASC;');

       
    // display each row
       
    while ($row mysql_fetch_array($result)) {
           
    // only check stack if there is one
           
    if (count($right)>0) {
               
    // check if we should remove a node from the stack
               
    while ($right[count($right)-1]<$row['dx']) {
                   
    array_pop($right);
               }
           }

           
    // display indented node title
           
    echo str_repeat('__',count($right)).$row['nome']."
    \n"
    ;

           
    // add this node to the stack
           
    $right[] = $row['dx'];
       }

    Codice PHP:
    buildThree(1); 

    che mi restituisce questo:
    Codice PHP:
    Massimiliano
    __Francesco
    ____Mario
    ____Luigi
    ____Fabio
    ______Piero
    ________Marco
    ______Gianni
    ____Gianni 
    boh... non ne sono del tutto convinto, ma sembra funzionare

  3. #3
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732
    aggiornamento: sono riuscito a ricreare una struttura ad albero degna di essere utilizzata

    Funzione di costruzione dell'albero
    $id è il nodo di partenza
    $albero è quello che viene restituito dalla funzionee
    Codice PHP:
    function ns_build_three($id) {
        
    $id = (int)$id;
        
    $right = array();
        
    // retrieve the left and right value of the $root node
        
    $result mysql_query('SELECT sx, dx FROM personale WHERE id="'.$id.'";');
        
    $row mysql_fetch_array($result);

        
    // now, retrieve all descendants of the $root node
        
    $result mysql_query('SELECT nome, sx, dx FROM personale WHERE sx BETWEEN '.$row['sx'].' AND '.$row['dx'].' ORDER BY sx ASC;');

        
    // display each row
        
    while ($row mysql_fetch_array($result)) {
            
    // only check stack if there is one
            
    if (count($right)>0) {
                
    // check if we should remove a node from the stack
                
    while ($right[count($right)-1]<$row['dx']) {
                
    array_pop($right);
                }
            }
            
    // display indented node title
            
    $albero[] = array(count($right), $row['nome']);
            
    // add this node to the stack
            
    $right[] = $row['dx'];
        }
        return 
    $albero;

    questa è il codice che richiama la precedente funzione:
    nel mio caso parto dall'id 1 (la mia radice)
    Codice PHP:
    $rows ns_build_three(1);
    $livello = -1;
    foreach (
    $rows as $row) {
        if (
    $livello $row[0]) {
             echo 
    "<ul>\n";
        } elseif (
    $livello $row[0]) {
             echo 
    "[/list]\n";
        } elseif (
    $livello == $row[0]) {
             echo 
    "\n";
        }
        echo 
    "[*]".$row[1];
        
    $livello $row[0]; // imposto il vecchio livello per sapere come devo salire o scendere nell'albero
    }
    echo 
    "";
    while (
    $livello 0) { // scendo i livelli della lista fino a chiuderla
         
    echo "[/list]\n";
         
    $livello $livello 1;
    }
    echo 
    "[/list]"
    ed ecco infine il codice risultante: (l'ho formattato a mano per renderlo più chiaro, comunque apre e chiude tutti i tag correttamente )
    codice:
    <ul>
    	[*]Massimiliano
    		<ul>
    			[*]Francesco
    				<ul>
    				[*]Mario
    				[*]Luigi
    				[*]Fabio
    					<ul>
    						[*]Piero
    							<ul>
    								[*]Marco
    							[/list]
    						
    						[*]Gianni
    					[/list]
    				
    				[*]Gianni
    				[/list]
    			
    		[/list]
    	[/list]

  4. #4
    Ho notato problemi nel tornare indietro da un livello n ad un livello molto meno profondo es.: 1,
    infatti il salto di livello non avviene, e torna indietro solo di un bnomio UL LI


    quindi ho inserito una ripetizione della chiusura del binomio[/list]tante volte quanto è la differenza del salto di livello:
    Codice PHP:
    $rows ns_build_three(1);
    $livello = -1;
    foreach (
    $rows as $row) {
        if (
    $livello $row[0]) {
             echo 
    "<ul>\n";
        } elseif (
    $livello $row[0]) {

        
    //calcolo il salto di livello e ripeto[/list]
            
    $rpt_ul=($livello-$row[0]);

             echo 
    "- differenza livello {$rpt_ul}"; echo str_repeat('[/list]',$rpt_ul)."\n";
        } elseif (
    $livello == $row[0]) {
             echo 
    "\n";
        } 
      
    //debug {$row[2]}
      
    echo "<li id=\"{$row[2]}\">".$row[1]." ".$row[0] ;
        
    $livello $row[0]; // imposto il vecchio livello per sapere come devo salire o scendere nell'albero
    }
    echo 
    "";
    while (
    $livello 0) { // scendo i livelli della lista fino a chiuderla
         
    echo "[/list]\n";
         
    $livello $livello 1;
    }
    echo 
    "[/list]"

  5. #5
    Utente di HTML.it L'avatar di lnessuno
    Registrato dal
    Feb 2002
    Messaggi
    2,732
    in effetti la mia soluzione dava dei problemi... ho risolto modificando il codice ma la tua soluzione mi sembra più snella... gli darò un'occhiata quando riesco, grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.