Рекурсивная запись PHP-функции во внешний массив - PullRequest
0 голосов
/ 12 марта 2011

Два вопроса здесь действительно; почему это происходит? И что с этим можно сделать?

Извините, вопрос так долго, но в большинстве случаев это просто 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], чтобы это не происходило?

Спасибо!

1 Ответ

2 голосов
/ 12 марта 2011

Плоский массив - это массив объектов (ссылок), даже если вы помещаете объекты в новый массив, это все тот же объект, который вы перемещаете.

Если вы не хотите редактировать одну и ту же ссылку, взгляните на Клонирование объектов

т.е. Использование:

$tree[$i] = clone $tag;
...