Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Umanista
    Registrato dal
    Jan 2002
    Messaggi
    1,022

    array multidimensionale per menu gerarchico

    Ho usato una tabella di MySql per le categorie di un catalogo.
    La tabella è strutturata nel classico modo che consente la creazione di infinite sottocategorie, ed ha quindi i seguenti campi:

    ID
    categoria
    livello
    IDcatMadre

    Una volta raccolte tutte le categorie in un array multidimensionale, avrei la necessità di ordinarlo gerarchicamente. In pratica dovrei ottenere una cosa simile:

    Pantaloni
    -- Pantaloni di Velluto
    -- Pantaloni di Cotone
    -- Pantaloni di pelle
    -- Jeans
    ---- Jeans scoloriti
    ---- Jeans

    Maglioni
    -- Maglioni di lana
    -- Maglioni di ecc.

    Scarpe
    -- Scarpe sportive
    ---- Scarpe da basket
    ---- Scarpe da tennis
    ---- Scarpini calcio
    -- Scarpe classiche
    ---- Mocassini
    ---- ecc..

    In pratica dovrei fare in modo che ogni categoria sia seguita immediatamente dalla propria sottocategoria.
    Sto facendo vari tentativi con un array multidimensionale, ma ancora non giungo allo scopo. Qualche suggerimento? Grazie mille in anticipo.

  2. #2
    devi usare la ricorsione
    Chiamatemi sven se volete non ho voglia di fare una nuova email per una nuova registrazione xD
    Mac Future User , Ventilatore for PC Cooler user , - dry is coming -

  3. #3
    Sto affrontando anche io un problema simile, solo che come puoi vedere ciò che voglio fare io è moooolto laborioso, se vuoi darci un'occhiata la discussione la trovi qua: http://forum.html.it/forum/showthrea...hreadid=746201

    Per risolvere il tuo problema comunque ti basta una funzione del genere:
    nome pagina prova2.php
    codice:
    <?
    include 'connect.inc.php'; //includi il file con cui ti connetti al db
    
    function display_children($parent, $level) { 
    	//Seleziono tutti i figli che hanno come genitore $parent_id
    	$sql = "SELECT * FROM trees WHERE parent_id LIKE '".$parent."'";
    	$result = mysql_query($sql)or die(mysql_error()); 
    
    	//visualizza tutti i figli
    	while ($row = mysql_fetch_array($result)) { 
    		//indentazione e visualizzazione della categoria èper ogni figlio
    		echo str_repeat('',$level);
    		print ''.$row['category'].'
    '; 
    
    		// call this function again to display this 	
    		// child's children 
    		display_children($row['id'], $level+1); 
       } 
    } 
    if (!$_GET['category'] && !$_GET['level'])
    	display_children(0,0);
    else
    	display_children($_GET['category'], $_GET['level'])
    ?>
    La funzione l'ho costruita basandomi su un db con il seguente dump:

    codice:
    #
    # Struttura della tabella `trees`
    #
    
    CREATE TABLE trees (
      id int(11) NOT NULL auto_increment,
      category varchar(50) NOT NULL default '',
      parent_id int(11) NOT NULL default '0',
      PRIMARY KEY  (id)
    ) TYPE=MyISAM;
    
    #
    # Dump dei dati per la tabella `trees`
    #
    
    INSERT INTO trees VALUES (1, 'pantaloni', 0);
    INSERT INTO trees VALUES (2, 'velluto', 1);
    INSERT INTO trees VALUES (3, 'cotone', 1);
    INSERT INTO trees VALUES (4, 'pelle', 1);
    INSERT INTO trees VALUES (5, 'jeans', 1);
    INSERT INTO trees VALUES (6, 'levi\'s', 5);
    INSERT INTO trees VALUES (7, 'ck', 5);
    INSERT INTO trees VALUES (8, 'maglioni', 0);
    INSERT INTO trees VALUES (9, 'di lana', 8);
    INSERT INTO trees VALUES (10, 'di cotone', 8);
    e basandomi sulla funzione postata qui:
    http://www.sitepoint.com/article/hie...-data-database



    edit -> nel codice questa riga echo str_repeat(' ',$level); al posto di metterci tre spazi mettici 3 o quanti vuoi & n b s p; scritto tutto attaccato, serve per indentare il testo.
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    428
    Sera,
    premetto che potrei errare completamente, ma perchè al posto di perdervi con soluzioni ricorsive con n query al db, una volta estratti i dati, al posto di creare una array multidimensionale, non componete una struttura dati tipo albero? oppure liste? mmhh.. forse vedrei meglio una struttura a liste ..


    ciao
    gnegno

  5. #5
    io il menu del mio sito l'ho fatto anche con struttura gerarchica, però la tabella l'ho strutturata così:
    codice:
    cat|mnu|sub|
     1 | 0 | 0 |
     1 | 1 | 0 |
     1 | 2 | 0 |
     1 | 2 | 1 |
     1 | 2 | 2 |
     1 | 3 | 3 |
     2 | 0 | 0 |
     2 | 1 | 0 |
     2 | 2 | 0 |
     2 | 2 | 1 |
     2 | 2 | 2 |
    ecc...
    e la richiamo con una query di questo tipo
    codice:
    SELECT * FROM `menu` GROUP BY cat, mnu, sub ORDER BY `cat` ASC
    facendo passare il tutto in un ciclo con controlli sugli zeri, ottengo la struttura gerarchica...

  6. #6
    Utente di HTML.it L'avatar di Umanista
    Registrato dal
    Jan 2002
    Messaggi
    1,022
    Vi ringrazio ragazzi
    Proverò ad applicare i vostri consigli e vi faccio sapere.

  7. #7
    Ti avviso, la funzione che ti ho postato sopra può andar bene se hai non molti dati all'interno del tuo database, perché come noti dal ciclo viene eseguita una query per ogni elemento presente nella tabella e non è la soluzione migliore quando si hanno molti dati [idem il fatto di ricosrtuirsi la gerarchia con un ciclo che controlla e risale al nodo padre atrverso il parent_id come diceva pugia]. Sono metodi non ottimali, se dai un'occhiata alla discussione che sto portando avanti dall'altra parte ti accorgerai che gestire una struttura gerarchica non è affatto una passeggiata. Diciamo che io ho esigenze un tantino diverse perché ho un casino di dati, ma bisogna tenere conto di molte cose.
    http://forum.html.it/forum/showthrea...hreadid=746201

    [il metodo più semplice da implementare non è sempre il metodo migliore ]
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  8. #8
    Utente di HTML.it L'avatar di Umanista
    Registrato dal
    Jan 2002
    Messaggi
    1,022
    Originariamente inviato da 13manuel84
    Ti avviso, la funzione che ti ho postato sopra può andar bene se hai non molti dati all'interno del tuo database, perché come noti dal ciclo viene eseguita una query per ogni elemento presente nella tabella e non è la soluzione migliore quando si hanno molti dati [idem il fatto di ricosrtuirsi la gerarchia con un ciclo che controlla e risale al nodo padre atrverso il parent_id come diceva pugia]. Sono metodi non ottimali, se dai un'occhiata alla discussione che sto portando avanti dall'altra parte ti accorgerai che gestire una struttura gerarchica non è affatto una passeggiata.[...]
    Si, ne sono ben cosciente. In realtà anch'io potrei avere a che fare con molti dati, nel senso che l'amministratore del sito potrà gestire a piacimento il proprio menu.

    Ho fatto qualche tentativo anche con il GROUP BY suggerito da Pugia, ma per il mio caso non funziona

    Continuerò a smanettare. Vi ringrazio ancora.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.