el arbol es de este tipo:
las restricciones son:
en la tabla los datos quedan asi:
a->b
a->c
a->d
b->e
b->f
c->h
d->j
f->g
f->i
j->n
g->k
i->l
l->m
las restricciones para el arbol son:
no pueden haber bucles:
ej: e->a //esto no puede ocurrir
que se ingresen datos ya existentes como
ej: a->g ; f->m
Ahora les pongo el codigo exactamente como lo programe, tiene muschos echo para q vean lo q hace, pero simplemente pueden leerlo un poco y limpiarlo.
lo que hace el codigo son 2 cosas:
1.- muestra a todos los hijos de algun padre x el que pregunten, si padre no es padre, no muestra nada
2.- muestra los hijos con sus respectivos padres, sobre el padre x el que preguntaron.
Código PHP:
<?
$conexion = mysql_connect("localhost", "root", "") or die ("kroketas de perro") ;
mysql_select_db("PruebaJerarquia", $conexion);
$sql2="SELECT * FROM jerarquia ";
$Resultado = mysql_query($sql2,$conexion);
?>
muestro el contenido de la bd
<table border="1" align="top">
<tr><td width="200">padre</td><td width="200">hijo</td></tr>
<?
while($Arreglo=mysql_fetch_array($Resultado)){
?>
<tr><td width="200"><? echo $Arreglo[jefe]; ?></td><td width="200"><? echo $Arreglo[emp]; ?></td></tr>
<?
}
?>
</table>
<?
echo "voi a buscar los hijos de la variable ".$rec[0] ="a";
$z=$rec[0];
$x=0;
$i=1;
//la idea es q el x persiga al i mientras se ejecuta la consulta, cada ves q el x no tenga ijos ira asercandose mas y mas al i
//y a su ves mientras sigan habiendo hijos el i se alejara rapidamente del x, sin 'padre' no tiene hijos' el while no se ejecuta
// e i no se incrementa
do{
echo "<br>al inicio x = ".$x;
echo "<br> padre a revisar hijos ".$rec[$x];
$sql="SELECT * FROM jerarquia WHERE (jefe = '$rec[$x]')";
$res = mysql_query($sql, $conexion);
while($arr = mysql_fetch_array($res)){
$padre[$x][$i] = $rec[$x];
echo "<br> hijo = ".$rec[$i] = $arr[emp];
echo "<br> fin while, rec = ".$rec[$i]." i =".$i;
echo "<br> i = ".$i++;
}//fin while
echo "<br>antes x = ".$x;
echo "<br>durante x = ".$x++;
echo "<br>despues x = ".$x;
}while($x<=$i);
//ahora muestro los hijos de $z q es el padre inicial
echo "<br> hijos de ".$z;
$j=0;//mostrar
while($j!=$i){
echo "<br>".$rec[$j];
$j++;
}
//ahora muestro a los padres correspondientes de sus hijos
$k=0;
$y=0;
while($y!=$i){
$k=0;
while($k!=$i){
if(trim($padre[$y][$k]) != NULL){ //si es distinto de null es xq existe un padre valido a mostrar
echo "<br>el padre de ".$rec[$k]." es ";
echo $padre[$y][$k];
}
$k++;
}//fin k
$y++;
}//fin y
?>
Código:
-- phpMyAdmin SQL Dump -- version 2.10.3 -- -- Servidor: localhost -- Tiempo de generación: 06-02-2009 a las 02:49:53 -- Versión del servidor: 5.0.51 -- Versión de PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de datos: `pruebajerarquia` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `jerarquia` -- CREATE TABLE `jerarquia` ( `IdJerarquia` int(255) NOT NULL auto_increment, `jefe` varchar(255) NOT NULL, `emp` varchar(255) NOT NULL, PRIMARY KEY (`IdJerarquia`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ; -- -- Volcar la base de datos para la tabla `jerarquia` -- INSERT INTO `jerarquia` VALUES (1, 'a', 'b'); INSERT INTO `jerarquia` VALUES (2, 'a', 'c'); INSERT INTO `jerarquia` VALUES (3, 'a', 'd'); INSERT INTO `jerarquia` VALUES (4, 'b', 'e'); INSERT INTO `jerarquia` VALUES (5, 'b', 'f'); INSERT INTO `jerarquia` VALUES (6, 'c', 'g'); INSERT INTO `jerarquia` VALUES (7, 'd', 'h'); INSERT INTO `jerarquia` VALUES (8, 'g', 'i'); INSERT INTO `jerarquia` VALUES (9, 'g', 'j'); INSERT INTO `jerarquia` VALUES (10, 'y', 'z'); INSERT INTO `jerarquia` VALUES (11, 'y', 'x'); INSERT INTO `jerarquia` VALUES (12, 'y', 'w'); INSERT INTO `jerarquia` VALUES (13, 'w', 'q'); INSERT INTO `jerarquia` VALUES (14, 'w', 's'); INSERT INTO `jerarquia` VALUES (15, 's', 'k'); INSERT INTO `jerarquia` VALUES (16, 's', 'l'); INSERT INTO `jerarquia` VALUES (17, 'k', 'ñ'); INSERT INTO `jerarquia` VALUES (18, 'z', 'a1'); INSERT INTO `jerarquia` VALUES (19, 'z', 'a2'); INSERT INTO `jerarquia` VALUES (20, 'a1', 'a3'); INSERT INTO `jerarquia` VALUES (21, 'a2', 'a5');