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!
incroyable! une question si longue pour une réponse aussi simple, merci beaucoup. testé et travaillant :) – Matthew