|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2006
Città: cosenza
Messaggi: 14
|
[PHP/MYSQL] Stampare una struttura gerarchica a infiniti livelli
Salve a tutti,
stò realizzando una piccola applicazione in php/mysql, per la memorizzazione di annunci economici, è ho un problema nel rappresentare una struttura gerarchica a infiniti livelli. Cerco di spiegarmi meglio, io ho questi ingredienti: Una tabella che mi memorizza gli annunci, così fatta: Annunci ( id*, cat_id*, titolo, ecc..); dove id, è chiave primaria, e cat_id è l'id della categoria in cui l'annuncio è inserito. e una tabella dove memorizzo le categorie: Categorie( id*, nome, parent_id); dove id è chiave primaria e parent_id è l'id della categoria genitore. Se il parent_id è uguale a zero ,la categoria non ha genitori sopra di lei, è quindi root. Quindi se ad esempio io ho queste tuple: (1, Informatica , 0 ); (2, Periferiche , 1 ); (3, Scanner, 2 ); (4, Monitor, 2 ); (5, Lcd, 4 ); (6, Crt, 4); (7, Abbigliamento, 0 ); (8, Uomo , 7 ); (9, Donna, 8 ); Io voglio ottenere una stampa di questo tipo: Informatica - Periferiche --Scanner --Monitor ---Lcd Abbigliamento---Crt --Uomo --DonnaIl problema è che a priori non sò quanti livelli ho nella mia struttura... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2007
Messaggi: 316
|
ti conviene a mio parere utilizzare delle classi, in modo da crearti un metodo che può richiamarsi ricorsivamente
esempio rapido: Codice:
//metodo dell'oggetto categoria
function caricaSottocategorie() {
//ti trovi le sottocategorie joinando la seconda tabella
$sql = "...";
//query($sql)..
while (//leggo il risultato del db) {
//crei la nuova categoria
$sottocategoria = new categoria(/* riga.. */);
//richiami il metodo in modo che il tutto sia ricorsivo
$sottocategoria->caricaSottocategorie();
//aggiungi questa sottocategoria all'array di sottocategorie dell'oggetto in questione
this->$sottocategorie[] = $sottocategoria;
}
}
$root->caricaSottocategorie(); con print_r($root) dovresti avere tutto l'albero (composto da oggetti e dai propri array di oggetti sottostanti) |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: May 2006
Città: cosenza
Messaggi: 14
|
Grazie per la risposta, avastreg
Stò già utilizzando una classe "categoria"... e avevo pensato di fare una funzione ricorsiva come quella che mi hai suggerito. Il problema che mi pongo è questo: dovendo stampare l'albero di tutte le categorie in ogni pagina del sito, questo approccio secondo te è efficente?? In questo modo per devo andare a fare una query nel db per ogni categoria presente, perchè per ognuna devo controllare se ha dei discendenti... |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2007
Messaggi: 316
|
Quote:
Un altro accorgimento in quest'ottica può essere creare classi categoria apposta per il menu (quindi con i parametri minimi necessari) oppure avere una funzione che ti esporta solo quello che ti serve (magari tutto come array). Già con gestione in sessione, però, dovrebbe risultare ottimizzato. Per la visualizzazione, io utilizzo smarty quindi sono legato a logiche un po' diverse dal classico php + html, ma cmq ora che hai l'albero puoi saperne la profondità e quindi creare <ul> <li> innestati finchè ne hai bisogno, a seconda del menu che devi realizzare; anche in questo caso magari serve una funzione ricorsiva che percorre l'albero e genera il codice relativo. |
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: May 2006
Città: cosenza
Messaggi: 14
|
vedrò di utilizzare le sessioni...
Di nuovo grazie ;-) |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2007
Messaggi: 316
|
di niente
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Bussero (MI)
Messaggi: 1263
|
Mysql non gestisce le tabelle ricorsive tipo quella che hai fatto te in maniera nativa.
Per fare quello che ti serve devi ristrutturare la tua tabella, e gestire le operazioni di cancellazione e inserimento in maniera un po' più complessa. In queste 3 paginette è tutto spiegato meglio di quanto possa fare io. http://www.sitepoint.com/article/hie...data-database/ G. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2003
Messaggi: 1784
|
per evitare query ricorsive
puoi semplicemente fare una singola query che ti scarichi tutta la tabella e lasciare a php il compito di ordinarla (array multidimensionali...) ciao |
|
|
|
|
|
#9 |
|
Messaggi: n/a
|
Ciao a tutti ho un problema analogo che vorrei cercare di risolvere.
Le funzioni ricorsive proprio non le digerisco. Diciamo che ho una tabella "struttura" a DB con due colonne: paginaID -- pagina_parentID ----1------------0-------- ----2------------0-------- ----3------------0-------- ----4------------1-------- ----5------------1-------- ----6------------2-------- ----7------------3-------- ----8------------3-------- ----9------------6-------- Come facile intuire laddove pagina_parentID è 0 significa che si tratta di una pagina di primo livello, il resto è nidificabile INFINITE volte (qui solo 3 per praticità). Come costruisco una funzione che RITORNI un array perfettamente gerarchizzato? Avevo cominciato ad abbozzare una funzione simile: Codice:
function struttura($id) {
$sql = "select * from struttura where pagina_parentID = " . $id;
$result = mysql_query($sql);
if ($row = mysql_fetch_assoc($result)) {
do {
$struttura[] = $row['paginaID'];
} while ($row = mysql_fetch_assoc($result));
} else {
return $struttura;
}
}
Tnx. Ultima modifica di anonimizzato : 09-11-2008 alle 12:11. |
|
|
|
#10 |
|
Messaggi: n/a
|
Codice:
function struttura($id) {
global $struttura;
$sql = "select * from struttura where pagina_parentID = " . $id;
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
if ($id != 0) {
if (!is_array($struttura[$id])) {
$struttura[$id] = array();
}
$struttura[$id][$row['paginaID']] = 1;
} else {
$struttura[$row['paginaID']] = 1;
}
struttura($row['paginaID']);
}
return $struttura;
}
Soluzioni? Ultima modifica di anonimizzato : 12-07-2009 alle 11:29. |
|
|
|
#11 |
|
Senior Member
Iscritto dal: Aug 2005
Città: Roma sud
Messaggi: 590
|
Anche io ho dovuto fare la stessa cosa http://www.hwupgrade.it/forum/showthread.php?t=1851265:)
ciao
__________________
-Mac Book intel core duo 1,83GHz, 1,25 Gb RAM -Amd athlon 64 dual core 4400+, 2 GB RAM, Asus a8n-sli Deluxe, totale 500 GB di HARD DISK(4 hdd) |
|
|
|
|
|
#12 |
|
Messaggi: n/a
|
Io però non voglio fare il "semplice" output a video indentato, ho bisogno di inserire il tutto in un array gerarchizzato.
Mostrare a video la struttura non è tanto complicato, nel senso che basta trovare il modo migliore per indentare il tutto. Es: Codice:
<?
require "connect.php";
function output_categorie($id_principale)
{
$sql = "SELECT * FROM downcat WHERE id_principale = \"$id_principale\"";
$res = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_assoc($res))
{
echo "<li>";
echo "<a href=apricat.php?id=".$row['id_cat'].">".$row['nome']."</a>";
//Stampa sottocategorie
output_categorie($row['id_cat']);
echo "</li>";
}
echo "</ul>";
}
output_categorie(0);
?>
Ultima modifica di anonimizzato : 09-11-2008 alle 13:41. |
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Codice PHP:
|
|
|
|
|
|
#14 |
|
Messaggi: n/a
|
Ti ringrazio, appena possibile me la studio.
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:09.




















