Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    Menù navigazione categorie

    Ciao a tutti,
    secondo voi come potrei estrarre i dati di seguito e creare un menù a tendina, con i nomi delle categorie e se presenti i nomi delle varie sottocategorie?
    codice:
    elettrodomestici
    elettrodomestici>cucine>elettriche
    elettrodomestici>cucine>gas
    forni
    forni>da incasso
    forni>da incasso>a gas
    forni>da incasso>elettrici
    forni>esterni
    forni>esterni>a gas
    forni>esterni>elettrici
    televisori
    televisori>LED
    televisori>LED>32 pollici
    televisori>LED>40 pollici
    televisori>plasma
    televisori>plasma>32 pollici
    televisori>plasma>40 pollici

  2. #2
    dove li hai questi valori?
    potresti prendere in considerazione di mettere tutto su un db.
    io ho fatto così.

  3. #3
    fermat quello che leggi è semplicemente l'elenco dei record di una tabella, i record son scritti proprio così.
    Come fai te a creare il menù?

  4. #4
    Se a priori non sai la quantità di voci puoi fare semplicemente una tabella nel db con due campi, uno con il nome della voce nel menu e l'altro con l'evenutale id di parentela con un'altra voce.
    Esempio
    id 1
    nome elettrodomestici
    parentela (vuoto)

    id 2
    nome cucine
    parentela 1 (elettrodomestici)

    id 3
    nome elettriche
    parentela 2

    id 4
    nome gas
    parentela 2

    In questo modo hai una tabella fissa con il grado di parentela. Poi te la giostri come ti pare.
    Pensa tu a come metterli in relazione tra loro. Magari puoi aggiungere il grado di parentela, non solo l'id di parentela.
    Aggiungi un campo in cui se è 0 vuol dire che è la categoria principale, se è 1 si tratta del primo figlio, 2 del secondo e via discorrendo...
    Ce l'ho fatta! - ItalianPixel -

  5. #5
    Grazie portapipe.
    Tutto nasce dalla necessità di importare un file csv con i prodotti da inserire in un ecommerce. Nella tabella di excel c'è anche una colonna che fa riferimento alla categoria ove sta il prodotto stesso, con il valore es. elettrodomestici>cucine>cucine a gas, valore che viene creato ex-novo ogni volta.
    I dati di questa colonna vengono salvati nella tabella delle categorie ("truncando" la tabella ogni volta) nel formato che ho postato all'inizio.
    Ora da quel formato io devo estrarre le voci di categoria, con tutte le sue categorie (a più livelli).
    In questo modo non posso seguire il tuo consiglio procedurale

  6. #6
    Urca! Allora ho bisogno di un esempio pratico perché i csv in mezzo sono problematici in quanto seguono un tipo di salvataggio dei dati che varia a seconda delle impostazioni...
    Ce l'ho fatta! - ItalianPixel -

  7. #7
    Originariamente inviato da portapipe
    Urca! Allora ho bisogno di un esempio pratico perché i csv in mezzo sono problematici in quanto seguono un tipo di salvataggio dei dati che varia a seconda delle impostazioni...
    Il problema non è quello di salvare a db i dati del csv, lì non ci son problemi e i dati relativi alla struttura delle categorie son già inseriti a db con un elenco di record come vedi nell'esempio iniziale.
    E' da quel elenco così fatto che devo creare sto benedetto menù (a tendina, ad albero, non importa la tipologia, mi importa come estrarre i dati "puliti").

  8. #8
    Dunque, con un po' di codice da manuale e per nulla raffinato, ho ottenuta quanto nell'immagine allegata.
    Ecco il codice:
    Codice PHP:
    $get_data "SELECT * FROM menu WHERE struttura NOT LIKE '%>%'";
        
        
    $result mysql_query($get_data$conn);
        
        while(
    $row mysql_fetch_array($result)){
        
            print 
    $row["struttura"] . "
    "
    ;
                
                
    $get_data2 "SELECT * FROM menu WHERE struttura LIKE '%" $row["struttura"] . ">%' AND struttura NOT LIKE '%>%>%' ORDER BY struttura";
          
          
    $result2 mysql_query($get_data2$conn);
                
                if(
    mysql_num_rows($result2) > 0){

                    while(
    $row2 mysql_fetch_array($result2)){
          
                print 
    "" substr($row2["struttura"], strrpos($row2["struttura"], ">")+1) . "
    "
    ;
                      
                      
    $get_data3 "SELECT * FROM menu WHERE struttura LIKE '%" substr($row2["struttura"], strpos($row2["struttura"], ">")+1) . ">%' ORDER BY struttura";
              
              
    $result3 mysql_query($get_data3$conn);
                      
                      if(
    mysql_num_rows($result3) > 0){
                          
                          while(
    $row3 mysql_fetch_array($result3)){
                              print 
    "" substr($row3["struttura"], strrpos($row3["struttura"], ">")+1) . "
    "
    ;
                          
                          }
                        
                    }
            
            }
                
                }
          
              
        } 
    Si presuppone che la struttura delle categorie non scenda oltre il terzo livello.
    Ma come ci fosse la necessità di andare oltre? O comunque non sapere a priori che livello di profondità si deve andare?
    Immagini allegate Immagini allegate

  9. #9
    Potresti fare un count dei valori di ogni stringa, rendendoli un array con valori divisi da tag >
    Così conti quanto a fondo vanno e fai tanti cicli, come hai fatto nel codice, in base al numero massimo delle sottocategorie.
    Mi sono capito?
    Ce l'ho fatta! - ItalianPixel -

  10. #10
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Che bell'esecizietto! Adorabile la ricorsione, mi sono divertito a risolverlo (anche se c'è voluto più tempo a mettere i doppi apici intorno all'array recordset che a scrivere il codice):

    Il codice prescinde dalla profondità delle categorie.
    Codice PHP:
    <?php
    //diciamo che esegui una query select * from menu order by struttura
    $recordset=array(
    "elettrodomestici",
    "elettrodomestici>cucine>elettriche",
    "elettrodomestici>cucine>gas",
    "forni",
    "forni>da incasso",
    "forni>da incasso>a gas",
    "forni>da incasso>elettrici",
    "forni>esterni",
    "forni>esterni>a gas",
    "forni>esterni>elettrici",
    "televisori",
    "televisori>LED",
    "televisori>LED>32 pollici",
    "televisori>LED>40 pollici",
    "televisori>plasma",
    "televisori>plasma>32 pollici",
    "televisori>plasma>40 pollici"
    );

    function 
    addToMenu(&$menu,$voci){
        if(!
    is_null($voce =  array_pop($voci))){        
            if(!isset(
    $menu[$voce]))            
                
    $menu[$voce]=array();        
            
    addToMenu($menu[$voce],$voci);
        }
    }

    function 
    showMenu($menu,$indent){
        foreach (
    $menu as $key => $value) {
            
    printf("%{$indent}s","");
            
    printf($key."
    "
    );
            if(
    is_array($menu[$key]))
                
    showMenu($menu[$key],$indent+4);        
        }
    }

    $menu=array();
    foreach (
    $recordset as $value) {//qui sostituisci con mysql_fetch_array
        
    $voci =  array_reverse(explode(">"$value));
        
    addToMenu($menu,$voci);
    }

    echo 
    "<pre>";
    showMenu($menu,0);
    echo 
    "</pre>";

    ?>
    l'output prodotto:
    codice:
    elettrodomestici
        cucine
            elettriche
            gas
    forni
        da incasso
            a gas
            elettrici
        esterni
            a gas
            elettrici
    televisori
        LED
            32 pollici
            40 pollici
        plasma
            32 pollici
            40 pollici
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

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 © 2024 vBulletin Solutions, Inc. All rights reserved.