[supersaibal]
Originariamente inviato da marketto
è possibile avere l'elenco del solo primo livello immediatamente sotto ad un altro? per esempio sapere che sotto francesco ci sono mario luigi e fabio.[/supersaibal]
Partendo dal codice che ha postato andrea poco sopra (che stampa l'intero albero), con qualche modifica si riesce ad ottenere il risultato desiderato.
Il primo passo è conoscere le etichette del nodo da cui vuoi partire
codice:
$sql = "SELECT id, sx, dx FROM personale WHERE nome='Francesco'";
$res = mysql_query($sql);
$line = mysql_fetch_assoc($res);
naturalmente nella clausula WHERE ho usato il nome solo per comodità, si potrebbe utilizzare l'ID
A questo punto riprendo il codice di andrea, con qualche modifica
codice:
$sql = "SELECT id, nome, sx, dx FROM personale WHERE sx >= {$line['sx']} AND dx <= {$line['dx']} ORDER BY sx ASC";
$res = mysql_query($sql);
$last_sx = $line['sx'];
$tab = 0;
$output = '<pre>';
while( $r = mysql_fetch_array( $res ) ) {
$compare = (int)$r[2];
if( $compare === ( $last_sx + 1 ) ) {
$tab++;
}
else if( $compare > ( $last_sx + 2 ) && $tab >= ( $compare - ( $last_sx + 2 ) ) ) {
$tab -= $compare - ( $last_sx + 2 );
}
if ($tab < 2) {
$output .= str_repeat( "\t", $tab );
$output .= "{$r['id']} - {$r['nome']} ({$r['sx']}, {$r['dx']})
";
}
$last_sx = $compare;
}
echo $output . '</pre>';
in grassetto le modifiche a cui è il caso di prestare attenzione (l'etichetta sx da cui si parte non sarà più "1" ma sarà quella del nodo che ti interessa, mentre il controllo sul $tab in sostanza ti dice quanti livelli dell'albero hai sceso).
Da notare come la struttura cosi com'è non ti dice immediatamente a che livello sei, spesso ho visto anche implementazioni che inseriscono un campo "level" numerico per dire a che livello si trova un nodo, comodo per fare query come questa che ti interessa, ma molto scomodo quando devi inserire, rimuovere, spostare i nodi perchè hai un campo in piu da aggiornare oltre alle due etichette
(ps: il codice sopra l'ho provato al volo ma magari si puo far di meglio
)