Построить дерево из плоского массива в PHP

Я поискал в Интернете и не совсем нашел то, что ищу. У меня есть плоский массив, каждый элемент которого содержит id и parent_id. У каждого элемента будет только ОДИН родительский элемент, но может быть несколько дочерних элементов. Если parent_id = 0, он считается элементом корневого уровня. Я пытаюсь превратить свой плоский массив в дерево. Другие образцы, которые я нашел, только копируют элемент в родительский элемент, но оригинал все еще существует.

РЕДАКТИРОВАТЬ

Каждый элемент начального массива считывается из отдельного файла XML. Сам файл будет иметь значение «0» в качестве значения parent_id, если у него нет родителя. Ключи на самом деле являются струнами.

Прошу прощения за ранее возникшую путаницу. Надеюсь, это более понятно:

/ EDIT

Мой начальный массив:

Array
(
    [_319_] => Array
        (
            [id] => 0
            [parent_id] => 0
        )

    [_320_] => Array
        (
            [id] => _320_
            [parent_id] => 0
        )

    [_321_] => Array
        (
            [id] => _321_
            [parent_id] => _320_
        )

    [_322_] => Array
        (
            [id] => _322_
            [parent_id] => _321_
        )

    [_323_] => Array
        (
            [id] => _323_
            [parent_id] => 0
        )

    [_324_] => Array
        (
            [id] => _324_
            [parent_id] => _323_
        )

    [_325_] => Array
        (
            [id] => _325_
            [parent_id] => _320_
        )
)

Результирующий массив после создания дерева:

Array
(
    [_319_] => Array
        (
            [id] => _319_
            [parent_id] => 0
        )

    [_320_] => Array
        (
            [id] => _320_
            [parent_id] => 0
            [children] => Array
                (
                    [_321_] => Array
                        (
                            [id] => _321_
                            [parent_id] => _320_
                            [children] => Array
                                (
                                    [_322_] => Array
                                        (
                                            [id] => _322_
                                            [parent_id] => _321_
                                        )
                                )
                        )
                    [_325_] => Array
                        (
                            [id] => _325_
                            [parent_id] => _320_
                        )
                )
    [_323_] => Array
        (
            [id] => _323_
            [parent_id] => 0
            [children] => Array
                (
                    [_324_] => Array
                        (
                            [id] => _324_
                            [parent_id] => _323_
                        )
                )
        )

Любая помощь / руководство приветствуются!

Некоторый код, который у меня есть на данный момент:


        function buildTree(array &$elements, $parentId = 0) {
        $branch = array();

        foreach ($elements as $element) {
            if ($element['parent_id'] == $parentId) {
                $children = $this->buildTree($elements, $element['id']);
                if ($children) {
                    $element['children'] = $children;
                }
                $branch[] = $element;
            }
        }

        return $branch;
    }

36
задан DSkinner 12 January 2012 в 18:55
поделиться