0

ここに2つの質問があります。なぜこうなった?そして、それについて何ができるでしょうか?

申し訳ありませんが、質問は非常に長いですが、ほとんどはprint_r出力されます!

基本的に、私はタグのフラット配列($tags)から始めます。それぞれにid(配列インデックス)とがnameありparent_idます。次に、再帰的に繰り返し、$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
        )
)

これは、子タグをネストするために再帰的に呼び出される関数です。問題は内部にありifます:私はそれに割り当て$tagてからプロパティを$tree[$i]追加します。childrenこれにより、childrenプロパティがに追加され$tagます。これは私が起こらないようにしたいことです。

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;
}

ネストされたタグの出力:

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
                                        )
                                )
                        )
                )
        )
)

childrenプロパティをに追加するとき、またはこれが発生しないよう$tree[$i]に割り当てるときに、別の方法で何ができますか?$tag$tree[$i]

ありがとう!

4

1 に答える 1

2

フラット配列は、オブジェクト (参照) の配列です。オブジェクトを新しい配列に入れても、移動しているオブジェクトは同じです。

同じ参照を編集したくない場合は、Object Cloningをご覧ください。

すなわち使用:

$tree[$i] = clone $tag;
于 2011-03-12T12:01:12.877 に答える