Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Percorso all'interno di un array multidimensionale

    Salve a tutti, chiedo scusa per il titolo un po' vago ma non mi è venuta in mente una descrizione migliore.
    Sto progettando un menù gerarchico con infinte sottocategorie.
    I dati sulle varie pagine sono tutti memorizzati in un DB.
    Il mio script estrae tutta la struttura del menu dal DB e lo trasforma in un array multidimensionale.
    La mia esigenza è questa:
    dato un elemento qualsiasi di questo menù restituirmi tutte le voci superiori.

    Vi incollo qui un esempio di array:
    (tenete presente che sia 'id' che 'title' sono univoche. 'padre' contiene l'id della voce precedente.
    codice:
    Array
    (
        [0] => Array
            (
                [id] => 1
                [title] => Home
                [padre] => 0
                [figlio] => Array
                    (
                    )
    
            )
    
        [1] => Array
            (
                [id] => 2
                [title] => Page 2
                [padre] => 0
                [figlio] => Array
                    (
                    )
    
            )
    
        [2] => Array
            (
                [id] => 4
                [title] => Page 3
                [padre] => 0
                [figlio] => Array
                    (
                        [0] => Array
                            (
                                [id] => 9
                                [title] => Figlio di Page 3
                                [padre] => 4
                                [figlio] => Array
                                    (
                                        [0] => Array
                                            (
                                                [id] => 11
                                                [title] => Figlio del figlio di Page 3
                                                [padre] => 9
                                                [figlio] => Array
                                                    (
                                                        [0] => Array
                                                            (
                                                                [id] => 13
                                                                [title] => MioTarget
                                                                [padre] => 11
                                                                [figlio] => Array
                                                                    (
                                                                    )
    
                                                            )
    
                                                    )
    
                                            )
    
                                    )
    
                            )
    
                        [1] => Array
                            (
                                [id] => 10
                                [title] => Io sono un altro figlio di Page 3
                                [padre] => 4
                                [figlio] => Array
                                    (
                                    )
    
                            )
    
                    )
    
            )
    
        [3] => Array
            (
                [id] => 5
                [title] => Page 4
                [padre] => 0
                [figlio] => Array
                    (
                        [0] => Array
                            (
                                [id] => 12
                                [title] => Figlio di Page 4
                                [padre] => 5
                                [figlio] => Array
                                    (
                                    )
    
                            )
    
                    )
    
            )
    
        [4] => Array
            (
                [id] => 6
                [title] => Page 5
                [padre] => 0
                [figlio] => Array
                    (
                    )
    
            )
    )
    Quello che voglio ottenere è questo:
    preso come input "MioTarget" o il suo id corrispondente (13) voglio che mi restituisca:
    Page 3 > Figlio di Page 3 > Figlio del figlio di Page 3 > MioTarget

    Spero che qualcuno di voi riesca a darmi una mano

    EDIT:
    per chi volesse fare delle prove vi incollo una versione serializata dell'array:
    codice:
    a:7:{i:0;a:7:{s:6:"ordine";s:1:"1";s:2:"id";s:1:"1";s:5:"title";s:8:"Homepage";s:10:"menu_title";s:4:"Home";s:4:"path";s:4:"home";s:5:"padre";s:1:"0";s:6:"figlio";a:0:{}}i:1;a:7:{s:6:"ordine";s:1:"2";s:2:"id";s:1:"2";s:5:"title";s:26:"Professional Boat Building";s:10:"menu_title";s:3:"Pbb";s:4:"path";s:3:"pbb";s:5:"padre";s:1:"0";s:6:"figlio";a:0:{}}i:2;a:7:{s:6:"ordine";s:1:"3";s:2:"id";s:1:"4";s:5:"title";s:18:"Fiera e Territorio";s:10:"menu_title";s:10:"Territorio";s:4:"path";s:10:"territorio";s:5:"padre";s:1:"0";s:6:"figlio";a:2:{i:0;a:7:{s:6:"ordine";s:1:"1";s:2:"id";s:1:"9";s:5:"title";s:23:"Il complesso fieristico";s:10:"menu_title";s:20:"Complesso Fieristico";s:4:"path";s:20:"complesso_fieristico";s:5:"padre";s:1:"4";s:6:"figlio";a:1:{i:0;a:7:{s:6:"ordine";s:1:"1";s:2:"id";s:2:"11";s:5:"title";s:7:"Cartina";s:10:"menu_title";s:7:"Cartina";s:4:"path";s:7:"cartina";s:5:"padre";s:1:"9";s:6:"figlio";a:1:{i:0;a:7:{s:6:"ordine";s:1:"1";s:2:"id";s:2:"13";s:5:"title";s:9:"Dettaglio";s:10:"menu_title";s:9:"Dettaglio";s:4:"path";s:9:"dettaglio";s:5:"padre";s:2:"11";s:6:"figlio";a:0:{}}}}}}i:1;a:7:{s:6:"ordine";s:1:"2";s:2:"id";s:2:"10";s:5:"title";s:13:"Come Arrivare";s:10:"menu_title";s:13:"Come Arrivare";s:4:"path";s:13:"come_arrivare";s:5:"padre";s:1:"4";s:6:"figlio";a:0:{}}}}i:3;a:7:{s:6:"ordine";s:1:"4";s:2:"id";s:1:"5";s:5:"title";s:6:"Eventi";s:10:"menu_title";s:6:"Eventi";s:4:"path";s:6:"eventi";s:5:"padre";s:1:"0";s:6:"figlio";a:1:{i:0;a:7:{s:6:"ordine";s:1:"1";s:2:"id";s:2:"12";s:5:"title";s:15:"Eventi Speciali";s:10:"menu_title";s:15:"Eventi Speciali";s:4:"path";s:8:"speciali";s:5:"padre";s:1:"5";s:6:"figlio";a:0:{}}}}i:4;a:7:{s:6:"ordine";s:1:"5";s:2:"id";s:1:"6";s:5:"title";s:15:"Esporre con PBB";s:10:"menu_title";s:7:"Esporre";s:4:"path";s:7:"esporre";s:5:"padre";s:1:"0";s:6:"figlio";a:0:{}}i:5;a:7:{s:6:"ordine";s:1:"6";s:2:"id";s:1:"7";s:5:"title";s:8:"Visitare";s:10:"menu_title";s:8:"Visitare";s:4:"path";s:8:"visitare";s:5:"padre";s:1:"0";s:6:"figlio";a:0:{}}i:6;a:7:{s:6:"ordine";s:1:"7";s:2:"id";s:1:"8";s:5:"title";s:11:"Area Stampa";s:10:"menu_title";s:11:"Area Stampa";s:4:"path";s:11:"area_stampa";s:5:"padre";s:1:"0";s:6:"figlio";a:0:{}}}

  2. #2
    mmm io non estrarrei tutti i dati dal DB se fosse possibile... non preferiresti una soluzione che funzioni con query ricorsive sul DB puttosto?

  3. #3
    Se fosse possibile preferirei lavorare sull'array, dato che me lo trovo già creato da dei passaggi precedenti.
    Ovvio che se non riesco a trovare un modo per estrapolare i dati dall'array opterò per riprenderli dal DB anche se mi sembra un po' uno spreco.
    Rimango in attesa ancora un po', non si sa mai che qualcuno se ne salti fuori con una funzioncina geniale

  4. #4
    vabbè:

    Codice PHP:
    $array = array(); //Il tuo array


    $elemento null;
    $id 13;


    foreach(
    $array as $voce)
    {
       if(
    $elemento  iterateOver($voce$id))
           break;
    }

    getParents($elemento$id);


    //Itera sull'array passato ed estra la voce con id = $idToSearch
    function iterateOver($voce$idToSearch)
    {
       if(
    $voce['id'] == $idToSearch)
          return 
    $voce;
       if(
    count($voce['figlio']) == 0)
          return 
    null;
       foreach(
    $voce['figlio'] as $child)
       {
          
    $voce iterateOver($child$idToSearch);
          if(
    $voce)
            return 
    $voce;
       }
    }

    //Ottiene ricorsivamente tutti gli elementi padri e li stampa in una riga
    function getParents($elem$idToSearch)
    {
       global 
    $array;
       if(
    $elem['padre'] != 0){
           foreach(
    $array as $voce)
              if(
    $e iterateOver($voce$elem['padre']))
                 break;
           
    getParents($e$idToSearch);
       }
       echo 
    $elem['title'].($elem['id'] == $idToSearch "" " > ");


  5. #5
    grazie mille, funziona alla perfezione

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.