Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-09-2008, 12:11   #1
ciuhd
Junior Member
 
L'Avatar di ciuhd
 
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
---Crt
Abbigliamento
--Uomo
--Donna
Il problema è che a priori non sò quanti livelli ho nella mia struttura...
ciuhd è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2008, 10:57   #2
avastreg
Senior Member
 
L'Avatar di avastreg
 
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;
}

}
una volta istanziata la categoria root (con una combinazione speciale nel costruttore), mettiamo che sia $root, facendo

$root->caricaSottocategorie();

con print_r($root) dovresti avere tutto l'albero (composto da oggetti e dai propri array di oggetti sottostanti)
avastreg è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2008, 11:14   #3
ciuhd
Junior Member
 
L'Avatar di ciuhd
 
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...
ciuhd è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2008, 12:19   #4
avastreg
Senior Member
 
L'Avatar di avastreg
 
Iscritto dal: Sep 2007
Messaggi: 316
Quote:
Originariamente inviato da ciuhd Guarda i messaggi
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...
per evitare di effettuare tutte quelle query ogni volta che ti caricano una pagina, puoi mettere in sessione l'albero (ok, la sessione non sarà proprio leggera, ma è meglio che rifare tutto il passaggio). Se in sessione c'e' già l'albero, usi quello, altrimenti lo inizializzi.

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.
avastreg è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2008, 12:23   #5
ciuhd
Junior Member
 
L'Avatar di ciuhd
 
Iscritto dal: May 2006
Città: cosenza
Messaggi: 14
vedrò di utilizzare le sessioni...


Di nuovo grazie ;-)
ciuhd è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2008, 12:30   #6
avastreg
Senior Member
 
L'Avatar di avastreg
 
Iscritto dal: Sep 2007
Messaggi: 316
di niente
avastreg è offline   Rispondi citando il messaggio o parte di esso
Old 30-09-2008, 15:23   #7
Hiskrtapps
Senior Member
 
L'Avatar di Hiskrtapps
 
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.
Hiskrtapps è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2008, 02:03   #8
nextstyle
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
nextstyle è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 10:03   #9
anonimizzato
 
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;		
	}	
		
}
Ma non riesco a capire dove e come devo annidare il richiamo ricorsivo a "struttura()" stessa.

Tnx.

Ultima modifica di anonimizzato : 09-11-2008 alle 12:11.
  Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 12:14   #10
anonimizzato
 
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;
		
	}
Sono arrivato a questo punto, tuttavia il terzo livello (nodo [6]) mi viene messo al primo livello invece che sotto il nodo [2].

Soluzioni?

Ultima modifica di anonimizzato : 12-07-2009 alle 11:29.
  Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 13:00   #11
frizzo28
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)
frizzo28 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 13:26   #12
anonimizzato
 
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);
?>
Ma se volessi "storare" tutto in un unico array multidimensionale?

Ultima modifica di anonimizzato : 09-11-2008 alle 13:41.
  Rispondi citando il messaggio o parte di esso
Old 09-11-2008, 21:06   #13
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
Codice PHP:
<?
    
function get_categorie($id_principale)
    {
        
$array = array();
            
        
$sql "SELECT * FROM downcat WHERE id_principale = '$id_principale'";
        
$res mysql_query($sql);
        while (
$row mysql_fetch_assoc($res))
        {
            
$array$row['id_cat'] ] = array(
                
'nome'                 => $row['nome'],
                
'sottocategorie'     => get_categorie($row['id_cat']
            );
        }
        
        return 
$array;
    }
    
    
$array get_categorie(0);
?>
Dovrebbe andare...
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2008, 15:52   #14
anonimizzato
 
Messaggi: n/a
Ti ringrazio, appena possibile me la studio.
  Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
iOS 27 porterà tante novità...
Tutte le migliori offerte sui robot aspi...
Attenti ai Samsung 990 Pro contraffatti,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v