Ordenar alfabéticamente un árbol
PHP
Publicado el 2 de Septiembre del 2007 por Xavi (548 códigos)
12.238 visualizaciones desde el 2 de Septiembre del 2007
Código que muestra como ordenar alfabéticamente un árbol.
id | idPadre | posVertical | posHorizontal | Texto |
4 | 0 | 1 | 0 | Bases de Datos |
19 | 4 | 2 | 1 | MySQL |
18 | 4 | 3 | 1 | Oracle |
5 | 0 | 4 | 0 | Diseño |
2 | 0 | 5 | 0 | Lenguajes de Programación |
17 | 2 | 6 | 1 | Python |
16 | 2 | 7 | 1 | Visual Basic |
1 | 0 | 8 | 0 | Sistemas Operativos |
7 | 1 | 9 | 1 | Linux |
14 | 7 | 10 | 2 | Debian |
15 | 7 | 11 | 2 | Ubuntu |
8 | 1 | 12 | 1 | Mac |
9 | 1 | 13 | 1 | SAP |
6 | 1 | 14 | 1 | Windows |
13 | 6 | 15 | 2 | 2000 |
11 | 6 | 16 | 2 | 2003 |
12 | 6 | 17 | 2 | Vista |
20 | 12 | 18 | 3 | Configuración |
21 | 12 | 19 | 3 | Instalación |
22 | 21 | 20 | 4 | Impresoras |
25 | 22 | 21 | 5 | Epson |
24 | 22 | 22 | 5 | HP |
26 | 24 | 23 | 6 | DeskJet |
29 | 26 | 24 | 7 | 850 |
28 | 26 | 25 | 7 | 850C |
27 | 24 | 26 | 6 | LaserJet |
10 | 6 | 27 | 2 | XP |
<?php
/*
-- Estructura y campos de la base de datos
CREATE DATABASE prueba;
USE prueba;
-- idPadre = indica el campo id del padre del registro
-- posVertical = indica la posicion vertical donde mostrar el registro
-- posHorizontal = indica la posicion horizontal donde mostrar el registro
-- text = texto descritivo del arbol
CREATE TABLE IF NOT EXISTS `arbol` (
`id` int(11) NOT NULL auto_increment,
`idPadre` smallint(6) NOT NULL default '0',
`posVertical` int(11) NOT NULL default '0',
`posHorizontal` smallint(6) NOT NULL default '0',
`text` varchar(50) default '',
PRIMARY KEY (`id`)
);
INSERT INTO `arbol` (`id`, `idPadre`, `posVertical`, `posHorizontal`, `text`) VALUES
(1, 0, 0, 0, 'Sistemas Operativos'),
(2, 0, 0, 0, 'Lenguajes de Programación'),
(4, 0, 0, 0, 'Bases de Datos'),
(5, 0, 0, 0, 'Diseño'),
(6, 1, 0, 0, 'Windows'),
(7, 1, 0, 0, 'Linux'),
(8, 1, 0, 0, 'Mac'),
(9, 1, 0, 0, 'SAP'),
(10, 6, 0, 0, 'XP'),
(11, 6, 0, 0, '2003'),
(12, 6, 0, 0, 'Vista'),
(13, 6, 0, 0, '2000'),
(14, 7, 0, 0, 'Debian'),
(15, 7, 0, 0, 'Ubuntu'),
(16, 2, 0, 0, 'Visual Basic'),
(17, 2, 0, 0, 'Python'),
(18, 4, 0, 0, 'Oracle'),
(19, 4, 0, 0, 'MySQL'),
(20, 12, 0, 0, 'Configuración'),
(21, 12, 0, 0, 'Instalación'),
(22, 21, 0, 0, 'Impresoras'),
(26, 24, 0, 0, 'DeskJet'),
(24, 22, 0, 0, 'HP'),
(25, 22, 0, 0, 'Epson'),
(27, 24, 0, 0, 'LaserJet'),
(28, 26, 0, 0, '850C'),
(29, 26, 0, 0, '850');
*/
// realizamos la conexión con la base de datos
$link = mysql_connect('localhost', 'root', '123456');
mysql_select_db("prueba");
// si hemos pulsado el enlace para ordenar el arbol
if($_SERVER["QUERY_STRING"]=="ordenar")
{
//colocamos la casilla de posicion vertical a 0
$result=mysql_query("UPDATE arbol SET posVertical=0",$link);
$posHorizontal=-1;
$newposVertical=0;
//llamamos a la función ordenar
ordenar(0);
}
/***** mostramos el listado en pantalla *****/
$result=mysql_query("SELECT * FROM arbol ORDER BY posVertical",$link);
echo "<table border=1>";
echo "<tr>";
echo "<td>id</td><td>idPadre</td><td>posVertical</td><td>posHorizontal</td><td>Texto</td>";
echo "</tr>";
while($row=mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>".$row["id"]."</td>";
echo "<td>".$row["idPadre"]."</td>";
echo "<td>".$row["posVertical"]."</td>";
echo "<td>".$row["posHorizontal"]."</td>";
echo "<td>";
echo str_repeat(" ",$row["posHorizontal"]);
echo $row["text"];
echo "</td>";
echo "</tr>";
}
echo "</table>";
echo "<p><a href='".$_SERVER["PHP_SELF"]."?ordenar'>Ordenar</a></p>";
/***** fin mostrar el listado el pantalla *****/
// función recursiva que ordena el arbol
function ordenar($idPadre)
{
$result=mysql_query("SELECT * FROM arbol WHERE idPadre=$idPadre AND posVertical=0 ORDER BY text",$GLOBALS["link"]);
//aumentamos la posicion horizontal
$GLOBALS["posHorizontal"]++;
while($row=mysql_fetch_array($result))
{
//aumentamos la posicion vertical
$GLOBALS["newposVertical"]++;
//modificamos el registro para colocar los valores de la posicion horizontal y vertical
$resultUpdate=mysql_query("UPDATE arbol SET posVertical=".$GLOBALS["newposVertical"].",posHorizontal=".$GLOBALS["posHorizontal"]." WHERE id=".$row["id"],$GLOBALS["link"]);
//volvemos a llamar la funcion con el nuevo id a ordenar
ordenar($row["id"]);
}
//disminuimos la posicion horizontal
$GLOBALS["posHorizontal"]--;
}
?>