Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    150

    Caricare un albero di dati

    salve a tutti, io ho una tabella dove sono presenti le categorie che devo utilizzare.
    Queste categorie possono essere nidificate, in modo da avere un albero completo.

    questa è la struttura della mia tabella:
    codice:
    id_categorie
    cat_descr
    cat_ordine
    cat_parent_id
    al momento mi carico l'intero albero ciclando ogni record per vedere se ha dei figli; anche se è un'opzione che posso utilizzare (con una 40ina di select me la cavo) è una soluzione a dir poco orrenda!

    come potrei fare per avere una gestione più "intelligente" dell'intera struttura?

    grazie in anticipo!

  2. #2
    non si capisce molto bene quello che vuoi fare...
    tu fai un SELECT * per vedere tutti i record in tabella? e poi? spiegati meglio
    Perpetual Ribellion With Absolutely No Cause

  3. #3
    crea una funzione ricorsiva

    Codice PHP:

    function get_level($parent=0){
       
    $sql 'SELECT FROM `tabella` WHERE `cat_parent_id` = '.$parent;
       
    $res mysql_query($sql);
       
       
    $tree = array();

       while(
    $row mysql_fetch_assoc($res)){
          
    $tree[] = array('cat'=>$row,'children'=>get_level($row['id_categorie']));
       }
       return 
    $tree;
    }

    $tree get_level(); 
    praticamente così dovresti trovarti una struttura del genere

    Codice PHP:

    array(

    '0' => array(
       
    'cat' => ....,//array associativo categoria primo livello
       
    'children' => array() //se questa categoria non ha sottocategorie
    ),
    '1' => array(
       
    'cat' => ....,
       
    'children' => array(
          
    '0'=>array(
             
    'cat'=>...,
             
    'children' => ....//e via così
          
    )
       ) 
    //se questa categoria ha sottocategorie
    )

    ); 
    Ubuntu rulez!! :P

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    150
    Originariamente inviato da DrugsMatt
    non si capisce molto bene quello che vuoi fare...
    tu fai un SELECT * per vedere tutti i record in tabella? e poi? spiegati meglio
    si scusa, sono stato un po' troppo ermetico.

    al momento io uso una funzione molto simile a quella suggerita da simotenax.
    però in questo modo devo fare una select per ogni categoria.

    anche se è un'opzione fattibile (non sono tantissime le categorie), ero curioso di sapere se poteva esistere un metodo più veloce..

    cmq grazie per la risposta lampo

  5. #5
    altrimenti potresti fare tutto con una query e lavorando di più di php, del tipo

    Codice PHP:

       $sql 
    'SELECT FROM `tabella` WHERE';
       
    $res mysql_query($sql);
       
       
    $rows = array();
       
    $parents = array();

       while(
    $row mysql_fetch_assoc($res)){
          
    $rows[] = $row;
          if(!
    is_array($row['cat_parent_id'])) $row['cat_parent_id'] = array();
          
    array_push($parents[$row['cat_parent_id']],$row['id_categorie']);
       } 
    quindi useresti ancora una ricorsione per scorrere l'albero, sta volta però senza interrogare il db

    Codice PHP:

    function print_level($parent 0){
          global 
    $rows;
          global 
    $parents;
          if(
    is_array($parents[$parent] && !empty($parents[$parent]))){
                foreach(
    $parents[$parent] as $el){
                      
    // agisco sull'elemento del livello corrente
                      // controllo se ha figli
                      
    if(is_array($parents[$el] && !empty($parents[$el]))){
                                  
    print_level($el);
                      }
                }
          }
    }

    print_level(); 
    Ubuntu rulez!! :P

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.