"espandere l'albero" nel senso di stamparlo a video?
Puoi usare gli esempi proposti sull'articolo di sitepoint con la funzione display_tree() riadattandoli al tuo DB
Naturalmente l'approccio cambia in base all'implementazione che hai scelto:
Adjacency list:
codice:
function display_tree($parent, $level) {
$sql = "SELECT id_impiegato FROM personale WHERE id_capo={$parent}";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
echo str_repeat('-',$level).$row['id_impiegato']."
";
display_tree($row['id_impiegato'], $level+1);
}
}
// poi richiami la funzione, partendo dalla radice
display_tree(0, 0);
Nell'articolo la radice ha come "padre", nel campo id_capo, il valore NULL
Per usare questa funzione conviene usare il valore 0, immaginando che gli id siano numeri interi positivi (da 1 in su quindi)
Modified Preorder Tree Traversal:
codice:
function display_tree($root) {
$sql = "SELECT sx, dx FROM personale WHERE id={$root}";
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($result);
$right = array();
$sql = "SELECT id, sx, dx FROM personale WHERE sx BETWEEN {$row['sx']} AND {$row['dx']} ORDER BY sx ASC";
$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
if (count($right)>0) {
while ($right[count($right)-1]<$row['dx']) {
array_pop($right);
}
}
echo str_repeat('-',count($right)).$row['id']."
";
$right[] = $row['dx'];
}
}
// poi la richiami
display_tree(1);
Entrambe queste funzioni stampano l'albero indicando solo l'id di ciascun record. Con poche modifiche si può adattare il tutto inserendo il nome di fianco all'id, oppure inserendo il tutto in un tag <select>, ecc.ecc.