如何使用关联数组创建没有单个顶部的树


How to create an tree that has no single top using associative arrays

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

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

我可以创建一个关联数组,使前两个级别。顶级父项及其子项。

现在,当我试图创建无限嵌套时,我的问题来了。我看不出有什么方法可以自动创建一个适应多个嵌套级别的方法,并将信息放在应该嵌套的地方。

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

编辑:我的问题是,如果我必须使用递归,而不是如何将我刚刚做的事情拆分成一个单独的方法。

 $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] );
                    }
                } 
            }

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

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

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