2011-03-12 3 views
0

Deux questions ici vraiment; Pourquoi cela arrive-t-il? Et que peut-on faire à ce sujet?Fonction PHP récursive qui écrit sur un tableau externe

Désolé la question est si longue mais la plus grande partie est print_r sortie!

Fondamentalement, je commence avec un réseau fixe de balises ($tags), chacune avec un id (index de tableau), name et parent_id. Je recopie ensuite récursivement sur $tags et imbrique toutes les balises enfant dans leur parent. (voir ci-dessous)

Cela fonctionne! (voir ci-dessous pour la sortie). Mais le problème que j'ai est que mon tableau plat de balises est écrit à partir de la fonction qui fait l'imbrication/récursion. (Voir ci-dessous)

plat de gamme tags:

Array 
(
    [1] => stdClass Object 
     (
      [name] => instruments 
      [parent_id] => 0 
     ) 

    [2] => stdClass Object 
     (
      [name] => strings 
      [parent_id] => 1 
     ) 

    [3] => stdClass Object 
     (
      [name] => violin 
      [parent_id] => 2 
     ) 

    [4] => stdClass Object 
     (
      [name] => cello 
      [parent_id] => 2 
     ) 

    [5] => stdClass Object 
     (
      [name] => woodwind 
      [parent_id] => 1 
     ) 

    [6] => stdClass Object 
     (
      [name] => flute 
      [parent_id] => 5 
     ) 
) 

Ceci est la fonction appelée récursive nicher les balises enfants. Le problème se situe à l'intérieur du if: j'affecte $tag à $tree[$i], puis j'y ajoute la propriété children. Cela entraîne l'ajout de la propriété children à $tag. C'est ce que je veux arrêter d'arriver.

public function tags_to_tree($tags, $parent_id = 0) 
{ 
    $tree = array(); 
    foreach($tags as $i => $tag) 
    { 
     // add this tag node and all children (depth-first recursive) 
     if(intval($parent_id) === intval($tag->parent_id)) 
     { 
      $tree[$i] = $tag; 
      $tree[$i]->children = $this->tags_to_tree($tags, $i); 
     } 
    } 
    return $tree; 
} 

sortie tags emboîtées:

Array 
(
    [1] => stdClass Object 
     (
      [name] => instruments 
      [parent_id] => 0 
      [children] => Array 
       (
        [2] => stdClass Object 
         (
          [name] => strings 
          [parent_id] => 1 
          [children] => Array 
           (
            [3] => stdClass Object 
             (
              [name] => violin 
              [parent_id] => 2 
             ) 

            [4] => stdClass Object 
             (
              [name] => cello 
              [parent_id] => 2 
             ) 
           ) 
         ) 

        [5] => stdClass Object 
         (
          [name] => woodwind 
          [parent_id] => 1 
          [children] => Array 
           (
            [6] => stdClass Object 
             (
              [name] => flute 
              [parent_id] => 5 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

Que puis-je faire différemment lorsque vous ajoutez la propriété children-$tree[$i], ou lors de l'affectation $tag-$tree[$i] pour empêcher que cela se passe?

Merci!

Répondre

2

Le tableau plat est un tableau d'objets (références), même si vous placez les objets dans un nouveau tableau, c'est toujours le même objet que vous déplacez.

Si vous ne voulez pas être éditer la même référence, un coup d'oeil à Object Cloning

à savoir l'utilisation:

$tree[$i] = clone $tag; 
+0

incroyable! une question si longue pour une réponse aussi simple, merci beaucoup. testé et travaillant :) – Matthew

Questions connexes