2010-04-07 7 views

risposta

0

Anche se la struttura dati mysql-side è alquanto esotici, i dati vengono ancora recuperato utilizzando normali metodi di query. Emettere l'istruzione select appropriata, eseguire il looping dei risultati e inserirli in un array PHP. Anche se non so perché vorresti, perché sarebbe molto più difficile eseguire le operazioni di set in PHP che in MySQL.

2

Uso un approccio simile, ma non proprio uguale, che mantiene anche un riferimento al genitore nel bambino; questo rende più semplice la costruzione di una struttura ad albero dai dati. Se questo è utile, posso pubblicare il codice per estrarre i dati in un albero in PHP.

@Marc, la struttura dati descritta non è necessariamente per eseguire operazioni impostate; semplifica il lavoro con la struttura. Se si desidera ottenere un intero albero di dati e ogni record memorizza solo un puntatore al record padre, è necessario interrogare in modo ricorsivo il database per ottenere l'intero albero dei dati. Se si utilizza l'approccio descritto qui, è possibile estrarre l'intero set in una query.

Modifica: ecco il codice che costruisce una struttura ad albero SE si gestisce un figlio -> riferimento padre e il materiale di destra/lft. Preferisco farlo, perché in realtà è ancora più veloce in questo modo se vuoi solo ottenere i diretti discendenti di un singolo livello dell'albero.

Ho provato a rimuoverlo per dimostrare l'essenziale, quindi potrebbero esserci degli errori di battitura, ecc. Ma dovresti avere l'idea. Le parti chiave sono

  • Ordina la tua query con "lft ASC", in questo modo elaborerai sempre un nodo genitore prima dei suoi figli.
  • Memorizzare un riferimento a ciascun nodo per ID; in questo modo ogni bambino di quel nodo può facilmente trovarlo e aggiungersi al genitore.
  • Iterate attraverso i risultati, memorizza il riferimento per ciascun ID (come sopra) e aggiungi questo nodo ai figli del suo genitore.

Comunque, ecco il codice -

<?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

Inoltre, questo collegamento qui (http://articles.sitepoint.com/article/hierarchical-data-database/2) è molto più facilmente digeribile, ma descrive esattamente la stessa tecnica. –

0

Guardando il tuo link lo farei con join a sinistra. Guarda l'esempio per Recupero di un albero 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';

wold bisogno di un LEFT JOIN per ogni livello gerarchico si desidera includere. Il risultato può quindi essere analizzato da php in qualsiasi struttura di dati desiderabile. Ignora semplicemente i risultati di NULL.

| 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 |

Quando si dispone di una struttura profonda, questo sarebbe un metodo peggiore perché i join MySQL richiedono molto tempo per l'esecuzione quando è necessario unire più tabelle.

Spero di non aver frainteso la tua domanda.

+0

L'intero punto della tecnica nell'articolo è di evitare di aver lasciato join/più query. Il problema qui non è la query (con l'approccio descritto tutto ciò che serve è "SELECT * FROM nested_category ORDER BY lft ASC") ma come convertire i risultati della query in una struttura in seguito. –

+0

Ok, in questo caso ignora il mio post. Scusa – cb0

0

Devo informarti sul metodo attraverso il quale puoi lavorare su strutture ad albero usando php .. senza ricorsivo. Penso che tu sia molto conosciuto con la libreria php standard (SPL). Puoi usare Iterator per la tua domanda.

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

ecco il link per la documentazione di SPL. qui ci sono alcune soluzioni per il tuo esempio di cui sopra di collegamento Mysql: - Con la semplice recuperare la matrice da tavolo si può lavorare su di loro e visualizzare come prefrence

per: - L'adiacenza Lista Modello

È possibile utilizzare "RecursiveIteratorIterator "che mostrerà tutti i risultati, compresi tutti i bambini.

Se si desidera mostrare solo i bambini. è possibile utilizzare "ParentIterator"

5

io non sono sicuro che è esattamente quello che stai chiedendo, ma vale la pena notare è possibile ottenere l'intero albero, una linea per ogni percorso, ogni percorso come una stringa come segue puramente in MySQL utilizzando GROUP_CONCAT e ampliando il "Recupero di un percorso singolo" esempio da 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; 

Ciò produrrà i percorsi per ogni nodo dell'albero.

Nota che nested_category AS node CROSS JOIN nested_category AS parent equivale a nested_category AS node, nested_category AS parent.

Questo usa specifica la stringa '|' come separatore, se si desidera esplodere questo in una serie di elementi di percorso & si sa che c'è una stringa che non è nei dati che è possibile specificare che invece.

+0

questa risposta scuote – JoshuaDavid

+0

con questa soluzione, è possibile utilizzare un eval() ben formato all'interno di un foreach() per analizzare rapidamente una matrice nidificata in 2 righe di codice. Per quanto riguarda la sicurezza, si presuppone che i dati delle categorie siano completamente affidabili. – JoshuaDavid

+0

Ho cercato questa risposta, grazie! – witzawitz

Problemi correlati