Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    1,150

    [PHP-MySQL] Costruire array per struttura annidata

    Ciao a tutti,
    devo visualizzare una struttura ad albero, con padri e figli annidati, su piu' livelli. Del tipo

    codice:
    38
      15
        10
        5
          2
          3
      17
        9
        8
      6
    26
      13
      1
      12
    18
      11
      7
    I dati sono in una tabella GRUPPI MySQL di questo tipo

    CODI_GRUPPO
    DESC_GRUPPO
    CODI_PADRE

    Un gruppo puo' essere o meno padre e a sua volta figlio.
    Un padre puo' avere piu' di un figlio o non averne.
    Un figlio puo' avere solo 1 padre.

    Se il db fosse stato Oracle, avevo a disposizione queste funzioni e questa soluzione,
    http://www.adp-gmbh.ch/ora/sql/connect_by.html

    Ma pare che su MySql non funzioni, quindi devo risolvere via Php e con gli array annidati.
    Dalla tabella riesco ad estrarre, con una join sulla stessa tabella GRUPPI, un record per ogni gruppo, comprensivo di codi_gruppo, desc_gruppo, codi_padre.

    Ma come costruiscono l'array finale che poi andro' a leggere per stamparlo a video?

    Grazie in anticipo per qualsiasi suggerimento

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    128
    dunque ad occhio:

    - ti costruisci un array di quelli di primo livello se la colonna codi_padre è null

    - per costruirti il secondo livello, verifichi tra tutti gli elementi quelli in cui il valore di codi_padre è nell'array del primo livello (con la funzione in_array)

    - e così via

    dovrebbe funzionare!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    1,150
    Grazie per la risposta, ma alla fine ho risolto cosi'

    Questa la select, leggermente complicata dall'aggiunta di una tabella di relazione per estrarre il padre principale

    Codice PHP:
    SELECT  g1.cod_grupo AS lev1,
           
    g1.nombre_grupo AS lev1_name,
           
    g2.cod_grupo as lev2,
           
    g2.nombre_grupo AS lev2_name,
           
    g3.cod_grupo as lev3,
           
    g3.nombre_grupo AS lev3_name,
           
    g4.cod_grupo as lev4,
           
    g4.nombre_grupo AS lev4_name,
           
    g5.cod_grupo as lev5,
           
    g5.nombre_grupo AS lev5_name
    FROM dp_grupos 
    AS g1
    LEFT JOIN dp_grupos 
    AS g2 ON g2.cod_grupo_padre g1.cod_grupo AND g2.activo='$iFlagActivo'
    LEFT JOIN dp_grupos AS g3 ON g3.cod_grupo_padre g2.cod_grupo AND g3.activo='$iFlagActivo'
    LEFT JOIN dp_grupos AS g4 ON g4.cod_grupo_padre g3.cod_grupo AND g4.activo='$iFlagActivo'
    LEFT JOIN dp_grupos AS g5 ON g5.cod_grupo_padre g4.cod_grupo AND g5.activo='$iFlagActivo'
    WHERE g1.cod_grupo = (select cod_grupo
                            FROM dp_grupos_usuarios
                           WHERE cod_usuario
    ='$id'
                             
    and defecto=1
    Questa select mi restituisce n-record, dove i campi sono i livelli eventualmente popolati. La profondita' massima e' fissata a 5.

    Quindi gli elementi risultanti dell'array sono di questo tipo,

    Codice PHP:
    ListaArray
    (
        [
    0] => Array
            (
                [
    lev1] => 5534
                
    [lev1_name] => GRUPO PADRE
                
    [lev2] => 5535
                
    [lev2_name] => SEGRETARIA GENERALE 
                
    [lev3] => 5536
                
    [lev3_name] => GABINETTO DEL
                
    [lev4] => 5541
                
    [lev4_name] => UNITA 3
                
    [lev5] => 
                [
    lev5_name] => 
            )

        [
    1] => Array
            (
                [
    lev1] => 5534
                
    [lev1_name] => GRUPO PADRE
                
    [lev2] => 5535
                
    [lev2_name] => SECRETARIA GENERAL DE 
                
    [lev3] => 5538
                
    [lev3_name] => UNITA 2
                
    [lev4] => 5593
                
    [lev4_name] => PRIMO OSPEDALE
                
    [lev5] => 
                [
    lev5_name] => 
            )

        [
    2] => Array
            (
                [
    lev1] => 5534
                
    [lev1_name] => GRUPO PADRE
                
    [lev2] => 5535
                
    [lev2_name] => SECRETARIA GENERAL DE 
                
    [lev3] => 5538
                
    [lev3_name] => UNIDAD 2
                
    [lev4] => 5594
                
    [lev4_name] => SECONDO OSPEDALE
                
    [lev5] => 
                [
    lev5_name] => 
            )

         [
    3] => Array
            (
                [
    lev1] => 5534
                
    [lev1_name] => GRUPO PADRE
                
    [lev2] => 5596
                
    [lev2_name] => SEGRETERIA 2
                
    [lev3] => 
                [
    lev3_name] => 
                [
    lev4] => 
                [
    lev4_name] => 
                [
    lev5] => 
                [
    lev5_name] => 
            )

    etcc.... 
    E poi utilizzando variabili temp per ogni livello, mi scrivo ogni record in una tabella html (questa parte puo' essere chiaramente applicata ad un JS apposito)

    Ci sara' sicuramente un modo migliore per estrarre i dati ma per il momento pare, dai primi test, funzionare.

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.