2010-04-07 15 views

Respuesta

0

Incluso si la estructura de datos del lado MySQL es algo exótico, los datos aún recuperar mediante métodos de consulta normales. Emita la instrucción de selección apropiada, repita los resultados y rellenela en una matriz de PHP. Aunque no sé por qué querrías hacerlo, ya que sería mucho más difícil hacer las operaciones establecidas en PHP que en MySQL.

2

Uso un enfoque similar, pero no exactamente el mismo, que también mantiene una referencia al padre en el niño; esto hace que sea más fácil construir una estructura de árbol a partir de los datos. Si esto es útil, puedo publicar el código para extraer los datos en un árbol en PHP.

@Marc, la estructura de datos descrita no es necesariamente para realizar operaciones de conjunto; simplemente hace que trabajar con la estructura sea más fácil. Si desea obtener un árbol completo de datos y cada registro solo almacena un puntero al registro padre, entonces necesita consultar recurrentemente la base de datos para obtener el árbol completo de datos. Si usa el enfoque descrito allí, puede extraer todo el conjunto en una consulta.

Editar: aquí está el código que construye una estructura de árbol SI usted mantiene una referencia hijo -> padre, así como las cosas lft/right. Prefiero hacer esto, porque en realidad es más rápido de esta manera si solo quieres obtener los descendientes directos de un solo nivel del árbol.

He tratado de despojarlo para demostrar lo esencial, por lo que puede haber algunos errores tipográficos, etc., pero debe entenderse. Las piezas clave son

  • Realice su consulta por "lft ASC", de esta manera siempre procesará un nodo principal antes de sus hijos.
  • Almacene una referencia a cada nodo por ID; De esta forma, cualquier hijo de ese nodo puede encontrarlo fácilmente y agregarse al padre.
  • Revise los resultados, almacene la referencia para cada uno por ID (como se indica anteriormente) y agregue este nodo a los elementos secundarios de su elemento primario.

De todos modos, aquí está el código -

<?php 
$children = mysql_query('SELECT * FROM nested_category ORDER BY lft ASC'); 

/* Get the first child; because the query was ordered by lft ASC, this is 
    the "root" of the tree */ 
$child   = mysql_fetch_object($children); 
$root   = new StdClass; 
$root->id  = $child->folderID; 
$root->children = array(); 
/* Store a reference to the object by the id, so that children can add 
    themselves to it when we come across them */ 
$objects  = array($root->id => $root); 

/* Build a tree structure */ 
while ($child = mysql_fetch_object($children)) { 
    /* Create a new wrapper for the data */ 
    $obj   = new StdClass; 
    $obj->id  = $child->id; 
    $obj->children = array(); 
    /* Append the child to the parent children */ 
    $parent = $objects[$child->parent]; 
    $parent->children[] = $obj; 
    $objects[$obj->id] = $obj; 
} 
+0

Además, este enlace aquí (http://articles.sitepoint.com/article/hierarchical-data-database/2) es mucho más fácil de digerir, pero describe exactamente la misma técnica. –

0

En cuanto a su enlace que lo haría con une a izquierda. Mira el ejemplo para Recuperar un Árbol Completo.

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4 FROM category AS t1 LEFT JOIN category AS t2 ON t2.parent = t1.category_id LEFT JOIN category AS t3 ON t3.parent = t2.category_id LEFT JOIN category AS t4 ON t4.parent = t3.category_id WHERE t1.name = 'ELECTRONICS';

había usted necesitará una combinación izquierda para cada nivel jerárquico que desee incluir. El resultado puede ser analizado por php en cualquier estructura de datos deseable. Simplemente ignore NULL resultados.

| ELECTRONICS | TELEVISIONS | TUBE | NULL |

| ELECTRONICS | TELEVISIONS | LCD | NULL |

| ELECTRONICS | TELEVISIONS | PLASMA | NULL |

| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |

| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS | NULL |

| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL |

Cuando tienes una estructura profunda, este sería un peor método porque las uniones de MySQL necesitan mucho tiempo para ejecutarse cuando se deben unir muchas tablas.

Espero no haber malinterpretado su pregunta.

+0

El objetivo de la técnica en el artículo es evitar tener uniones/consultas múltiples. El problema aquí no es la consulta (con el enfoque descrito, todo lo que necesita es "SELECT * FROM nested_category ORDER BY lft ASC"), pero cómo convertir los resultados de la consulta en una estructura posterior. –

+0

Ok, en este caso ignora mi publicación. Lo siento – cb0

0

Tengo que informarle sobre el método a través del cual puede trabajar en estructuras de árbol usando php .. sin recursivo. Creo que eres muy conocido con la biblioteca de php estándar (SPL). Puedes usar Iterators para tu pregunta.

http://www.php.net/~helly/php/ext/spl/

aquí está el enlace para la documentación de SPL. aquí hay algunas soluciones para su ejemplo por encima del enlace de MySQL: - Por simple hecho de extraer la matriz de la tabla se puede trabajar en ellos y mostrar como su prefrence

a: - La Lista Modelo de Adyacencia

Puede utilizar "RecursiveIteratorIterator "que mostrará todos los resultados, incluidos todos los niños.

Si solo desea mostrar los niños. puede usar "ParentIterator"

5

No estoy seguro de que sea exactamente lo que está pidiendo, pero vale la pena señalar que puede obtener todo el árbol, una línea por ruta, cada ruta como una cadena de la siguiente manera puramente MySQL utilizando GROUP_CONCAT y la ampliación de la "Recuperación de una ruta única" ejemplo de http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

SELECT 
    GROUP_CONCAT(parent.name ORDER BY parent.lft ASC SEPARATOR '|') 
FROM nested_category AS node 
    CROSS JOIN nested_category AS parent 
WHERE 
    node.lft BETWEEN parent.lft AND parent.rgt 
GROUP by node.id 
ORDER BY node.lft; 

Esta es la salida de los caminos para cada nodo en el árbol.

Tenga en cuenta que nested_category AS node CROSS JOIN nested_category AS parent es equivalente a nested_category AS node, nested_category AS parent.

Este usos especifica la cadena '|' como el separador, si desea explotar esto en una matriz de elementos de ruta &, sabe que hay una cadena que no está en sus datos, puede especificar eso en su lugar.

+0

esta respuesta rocas – JoshuaDavid

+0

con esta solución, puede usar un eval() bien formado dentro de foreach() para analizar rápidamente en una matriz anidada en 2 líneas de código. En lo que respecta a la seguridad, esto supone que los datos de categoría son totalmente confiables. – JoshuaDavid

+0

He estado buscando esta respuesta, ¡gracias! – witzawitz

Cuestiones relacionadas