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

    Aggiungere un nodo ad un array gerarchico

    Salve a tutti...

    Sto letteralmente impazzendo, spero possiate darmi una mano a capire cosa c'e' che non va...

    Cerchero' di essere chiaro...

    Ho un array (di esempio):

    codice:
    $array = array("Etichetta 1" => "Nodo 1", "111" => array("Key 1" => "Valore 1",
        "Key 2" => "Valore 2", "Key 3" => "Valore 3", "Key 4" => "Valore 4"),
        "Etichetta 3" => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), "Etichetta 4" =>
        array("asd", "asdasdasd", "Etichetta" => array(100, 101, 102, 103, 104, "Nested" =>
        array("prova 1", "prova 2", "prova 3", "prova 4", "prova 5"), 106, 107, 108, 109)),
        "Etichetta 5" => array("Nodo vuoto"));
    
    
    ** PRINT_R per chiarezza**
    
    Array
    (
        [Etichetta 1] => Nodo 1
        [111] => Array
            (
                [Key 1] => Valore 1
                [Key 2] => Valore 2
                [Key 3] => Valore 3
                [Key 4] => Valore 4
            )
    
        [Etichetta 3] => Array
            (
                [0] => 1
                [1] => 2
                [2] => 3
                [3] => 4
                [4] => 5
                [5] => 6
                [6] => 7
                [7] => 8
                [8] => 9
                [9] => 10
                [10] => 11
            )
    
        [Etichetta 4] => Array
            (
                [0] => asd
                [1] => asdasdasd
                [Etichetta] => Array
                    (
                        [0] => 100
                        [1] => 101
                        [2] => 102
                        [3] => 103
                        [4] => 104
                        [Nested] => Array
                            (
                                [0] => prova 1
                                [1] => prova 2
                                [2] => prova 3
                                [3] => prova 4
                                [4] => prova 5
                            )
    
                        [5] => 106
                        [6] => 107
                        [7] => 108
                        [8] => 109
                    )
    
            )
    
        [Etichetta 5] => Array
            (
                [0] => Nodo vuoto
            )
    
    )
    Organizzazione gerarchica, ci sono alcuni nodi-padre con sotto-nodi, ecc... niente di che ...

    Mi serve una funzione che aggiunga un figlio al nodo che ha come etichetta quella che gli viene specificata.

    Avevo pensato a una cosa del genere:

    codice:
    function aggiungi_figlio(&$albero, $padre, $figlio)
    {
        $point = &$albero;
    
        foreach ($point as $key => $value) {
            $point = &$albero[$key];
    
            if ($key == $padre) {
                if (is_array($point))
                    $point[] = $figlio;
                else
                    $point = array($value, $figlio);
                
                return $albero;
            } else
                if (is_array($value)) {
                    aggiungi_figlio($point, $padre, $figlio);
                }
        }
    }
    Ma non va ... ossia, funziona benissimo se il nodo padre è al primo livello, il problema e' la ricorsione... e' tutto li', non va bene questo pezzo:

    codice:
    else
                if (is_array($value)) {
                    aggiungi_figlio($point, $padre, $figlio);
                }
    Ma non riesco a capire cosa c'e' che non va...

    Andiamo passo passo:

    Dopo aver dichiarato l'array nell'esempio, chiamo la funzione cosi':

    codice:
    $array = aggiungi_figlio($array, "Etichetta 5", "Aggiunto!!!");
    A questo punto parte la funzione... gli vene dato l'intero array. Per prima cosa crea un riferimento al punto in cui siamo nell'albero, chiamato $point. Poi scorre i vari elementi di quel livello dell'albero e se trova una corrispondenza con il valore del nodo padre che gli ho indicato, lo aggiunge. Fin qui funziona, come dicevo. Il problema e' che se non lo trova, deve verificare se ognuno dei figli che ha passato in rassegna è o no un array. Se e' un array, ovviamente, parte la ricorsione.

    Il problema e' li'. La cosa che mi e' venuta da fare e' semplicemente ripassare alla stessa funzione il riferimento $point al punto in cui eravamo arrivati nello scorrere l'albero. Quindi in teoria lui, ricorsivamente, crea un altro puntatore al sotto-ramo, e rifa' tutto da capo. Ma non va... mi sa che c'è qualche problema col puntatore, nel senso che finito un ramo lui non torna indietro, ma ho usato proprio per questo sempre la stessa variabile $point, in modo che i vari cicli nidificati riscrivessero sempre la stessa variabile di "puntamento"...

    Help please!

  2. #2
    Niente niente?

    Nel frattempo sto cercando di sistemare il return della funzione, perché mi sa che uno dei problemi è quello...

  3. #3
    Ok ho risolto ... dipendeva dall'array iniziale ... pensa te... ! Ho quasi il mal di testa per le prove che ho fatto, e dipendeva dal maledetto array iniziale di prova ...

    In pratica se non c'è una chiave definita nell'array, o in uno dei sotto-array, l'if che controlla se quello è il padre che sto cercando da' valore positivo al primo elemento dell'array, quindi aggiunge l'elemento e termina il ciclo che scorre quell'array.

    Ricapitolando, qualora dovesse servire a qualcuno, la funzione corretta GREZZA (c'e' da lavorarci un sacco, ma di base fa il suo dovere), è questa:

    codice:
    $array = array("Etichetta 1" => "Nodo 1", "111" => array("Key 1" => "Valore 1",
        "Key 2" => "Valore 2", "Key 3" => "Valore 3", "Key 4" => "Valore 4"),
        "Etichetta 3" => array(1 => "aaa1", 2 => "aaa2", 3 => "aaa3", 4 => "aaa4", 5 => "aaa5", 6 => "aaa6", 7 => "aaa7", 8 => "aaa8", 9 => "aaa9", 10 => "aaa10", 11 => "aaa11"), "Etichetta 4" =>
        array(1 => "asd", 2 => "asdasdasd", "Etichetta" => array(100 => "aaa100", 101 => "aaa101", 102 => "aaa102", 103 => "aaa103", 104 => "aaa104", "Nested" =>
        array("prova 1", "prova 2", "prova 3", "prova 4", "prova 5"), 106 => "aaa106", 107 => "aaa107", 108 => "aaa108", 109 => "aaa109")),
        "Etichetta 5" => array(1 => "Nodo vuoto"));
    
    function aggiungi_figlio(&$albero, $padre, $figlio)
    {
        $point = &$albero;
    
        foreach ($point as $key => $value) {
            $point = &$albero[$key];
    
            if ($key == $padre) {
                if (is_array($point))
                    $point[] = $figlio;
                else
                    $point = array($value, $figlio);          
            } else
                if (is_array($value)) {
                    aggiungi_figlio($point, $padre, $figlio);
                }
        }
    }
    
    aggiungi_figlio($array, "Nested", "Aggiunto!!!");
    
    echo "<pre>";
    print_r($array);
    echo "</pre>";
    Fiuuu ... che faticaccia per 'sta stxxxxata...!

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.