0

我有一个包含大约 300 个项目的数组。每个项目有 5 个属性。有些项目有一个父项目。嵌套项目需要能够扩展到无限嵌套。

我需要组织数组,以便所有具有父项的项都在父项children属性内。将childchildren

我可以创建一个关联数组来创建前 2 个级别。最上面的父项和它的子项。

现在,当我尝试创建无限嵌套时,我的问题就来了。我看不到一种方法可以自动创建一种方法来适应多个嵌套级别并将信息放在应该嵌套的位置。

我从来没有建立过这样的树,性能是至关重要的。谁能指导我如何实现我打算实现的目标?我真的很感激

编辑:我的问题是如果我必须使用递归,而不是如何将我刚刚完成的内容拆分为 1 个单独的方法。

 $tree = array();
            /*
             * $three = array( array( 'id','parent_id','displayAs', 'children' ) )
             */
            foreach ( $taxonomyFullList as $firstLevel ) {

                // Get all
                if( (int)$firstLevel['parent_id'] == 0 ) {
                    $tree[] = array( 
                                    'id' => $firstLevel['id'],
                                    'parent_id' => $firstLevel['parent_id'],
                                    'displayAs' => $firstLevel['displayAs'],
                                    'type' => $firstLevel['type'],
                                    'children' => array()
                                    );
                    $key = array_search( $firstLevel,$taxonomyFullList );
                    unset( $taxonomyFullList[$key] );
                }
            }

            foreach ( $taxonomyFullList as $secondLevel ) {
                foreach ( $tree as $firstTreeLevel ) {
                    if( (int)$secondLevel['parent_id'] === (int)$firstTreeLevel['id'] ) {

                        $newArray =  array( 
                                    'id' => $secondLevel['id'],
                                    'parent_id' => $secondLevel['parent_id'],
                                    'displayAs' => $secondLevel['displayAs'],
                                    'type' => $secondLevel['type'],
                                    'children' => array()
                                    );
                        $key = array_search( $firstTreeLevel, $tree );
                        array_push( $tree[$key]['children'], $newArray );

                        $taxonomyFullListKey = array_search( $secondLevel,$taxonomyFullList );
                        unset( $taxonomyFullList[$taxonomyFullListKey] );
                    }
                } 

            }
4

1 回答 1

0

这取决于您的数据,但您可能不得不在某处使用递归。首先,创建一个填充一个项目的函数,然后,当该项目有子项时,重用相同的函数。

基本上,你需要有这样的东西:

function createItem() {
    $item = array();
    // ...
    // populate the item properties
    // ...
    $item['children'] = createItem();
    return $item;
}

$root = createItem();
于 2013-08-13T14:35:21.287 回答