Código de PHP - Ordenar alfabéticamente un árbol

Versión 1
estrellaestrellaestrellaestrellaestrella(2)

Publicado el 2 de Septiembre del 2007gráfica de visualizaciones de la versión: Versión 1
12.107 visualizaciones desde el 2 de Septiembre del 2007
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

ididPadreposVerticalposHorizontalTexto
4010Bases de Datos
19421   MySQL
18431   Oracle
5040Diseño
2050Lenguajes de Programación
17261   Python
16271   Visual Basic
1080Sistemas Operativos
7191   Linux
147102      Debian
157112      Ubuntu
81121   Mac
91131   SAP
61141   Windows
136152      2000
116162      2003
126172      Vista
2012183         Configuración
2112193         Instalación
2221204            Impresoras
2522215               Epson
2422225               HP
2624236                  DeskJet
2926247                     850
2826257                     850C
2724266                  LaserJet
106272      XP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?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"]--;
}
?>



Comentarios sobre la versión: Versión 1 (2)

hadrien
11 de Diciembre del 2007
estrellaestrellaestrellaestrellaestrella
Hola,
si necesito listar los directorios contenidos en un directorio dado, ¿sería correcto incluir en el CREATE TABLE `àrbol` un "índice autorreferente", FOREIGN KEY (idPadre) REFERENCES arbol(`id`) , para poder tener un índice rápido al padre? ¿O sería suficiente con una definición similar a la del código?

Gracias.

Saludos,

Hadrien
Responder
luis
18 de Noviembre del 2008
estrellaestrellaestrellaestrellaestrella
para que sirven estos campos: posVertical,posHorizontal y como es que agarraron valores automaticamente...y si deseo agregar un tipo de s.o por ejemplo como se haria o que valores deben de tomar los campos posVertical y posHorizontal????
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s1559