Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中递归创建多维数组_Php_Recursion_Menu_Multidimensional Array - Fatal编程技术网

在PHP中递归创建多维数组

在PHP中递归创建多维数组,php,recursion,menu,multidimensional-array,Php,Recursion,Menu,Multidimensional Array,我试图找出编写PHP函数的最佳方法,该函数将递归地从mysql表中构建具有未知子级数的多维数组。它的目的是创建一个数据结构,该数据结构可以循环创建网站上的导航菜单,每个菜单项可能都有一个子菜单和子菜单项 表中的注释字段为: int ItemID int ParentID varchar ItemText 文本项链接 tinyint有孩子 因此,函数返回的数组示例如下: $menuItems = array( itemID# => array(

我试图找出编写PHP函数的最佳方法,该函数将递归地从mysql表中构建具有未知子级数的多维数组。它的目的是创建一个数据结构,该数据结构可以循环创建网站上的导航菜单,每个菜单项可能都有一个子菜单和子菜单项

表中的注释字段为:
int ItemID
int ParentID
varchar ItemText
文本项链接
tinyint有孩子

因此,函数返回的数组示例如下:

$menuItems = array( itemID# => array( 'ItemText' => 'Home', 'ItemLink' => 'index.php', 'Children' => array( itemID# => array ( 'ItemText' => 'Home Sub 1', 'ItemLink' => 'somepage.php', 'Children' => 0 ), itemID# => array ( 'ItemText' => 'Home Sub 2', 'ItemLink' => 'somepage2.php', 'Children' => 0 ), ) ), itemID# => array( 'ItemText' => 'Contact', 'ItemLink' => 'contact.php', 'Children' => 0 ) ) ); $menuItems= 排列( itemID#=> 排列( 'ItemText'=>'Home', 'ItemLink'=>'index.php', 'Children'=>数组( itemID#=>数组( 'ItemText'=>'Home Sub 1', 'ItemLink'=>'somepage.php', “儿童”=>0 ), itemID#=>数组( 'ItemText'=>'Home Sub 2', 'ItemLink'=>'somepage2.php', “儿童”=>0 ), ) ), itemID#=> 排列( 'ItemText'=>'Contact', 'ItemLink'=>'contact.php', “儿童”=>0 ) ) );
如果有人能为我指明正确的方向,我将不胜感激。谢谢

有一个函数,该函数每次获取数组元素时都会调用自身。 例如:

调用函数以显示节点。然后,它检查调用它的节点是否有子菜单,如果有子菜单,它将再次调用自己。这个过程会重复,直到它消失,所有之前的函数调用都会返回

void printData($mysql_table_node){
    if($mysql_table_node.has_node()){
        for($i = 0; $i < $mysqql_table_node.num_nodes()){
            printData($mysql_table_node->own_node);
        }
    }
        return;
}
void printData($mysql\u table\u node){
if($mysql\u table\u node.has\u node()){
对于($i=0;$i<$mysqql_table_node.num_nodes()){
printData($mysql\u table\u node->own\u node);
}
}
返回;
}

不太难。您要做的是将菜单项存储在一个数组中,在该数组中您可以按ID查找它们。然后您迭代菜单项,如果它们具有非空的ParentID,则将它们添加到其父项的子项列表中。然后从主列表中删除所有子项,以便只剩下顶级项

代码:


我知道这是一个迟来的答复,但我发现这上面的脚本,它是美妙的。我遇到了一个问题,尽管它让我的孩子们不安,因为ItemID的工作方式,当我使用类似设计的表运行它到OP时。为了解决这个问题,考虑到大多数web服务器中的RAM应该能够处理这个问题,我举了一个很好的例子,并对它进行了轻微的修改。我创建了一个新的数组,并将其全部构建在一个数组中,而不必对所有项应用子项,然后在之后取消它们的设置

代码:

希望这对其他人有所帮助,因为上述内容确实帮助了我

多维树和无序HTML列表生成器
  • 从多维数组递归构建
  • 树生成多维HTML列表代码(1)
  • 您永远无法知道给定项目列表中有多少维度。 每个元素可以有一个儿子->孙子->曾孙等等

    因此,必须使用生成多维列表

    代码如下: 以及:

    • 一个
    • 两个
      • 二十
      • 二十一
        • 210
        • 211
        • 二百一十二

    我理解您的逻辑,但我认为您在解决方案中的抽象级别有点让我难以理解。如何创建这些节点对象以及检查节点对象是否具有节点的方法?如果我自己的问题是荒谬的,我道歉:)一个简单的方法是在每个数据变量上都有标志。如果节点具有子级别,则该标志将增加其具有子级别的次数。如果这个数字大于0,那么它有子级别。这看起来正是我需要的,我很感激John。为了确保我看对了这个问题,这个解决方案将适用于无限数量的子级别,对吗?看起来是这样的,只是要确保我的示例数据只有一个子级别。不管怎样,只是用一组更复杂的测试数据对其进行了测试,效果非常好:)这工作完美无瑕,效率极高。非常感谢你把它放在那里。
    <?php
    $menuItems = array
    (
        1 => array
        (
            'ItemText' => 'Home',
            'ItemLink' => 'index.php',
            'ParentID' => null,
        ),
    
        2 => array
        (
            'ItemText' => 'Home Sub 1',
            'ItemLink' => 'somepage.php',
            'ParentID' => 1,
        ),
    
        3 => array
        (
            'ItemText' => 'Home Sub 2',
            'ItemLink' => 'somepage2.php',
            'ParentID' => 1,
        ),
    
        4 => array
        (
            'ItemText' => 'Contact',
            'ItemLink' => 'contact.php',
            'ParentID' => null,
        ),
    );
    
    // Each node starts with 0 children
    foreach ($menuItems as &$menuItem)
        $menuItem['Children'] = array();
    
    // If menu item has ParentID, add it to parent's Children array    
    foreach ($menuItems as $ID => &$menuItem)
    {
        if ($menuItem['ParentID'] != null)
            $menuItems[$menuItem['ParentID']]['Children'][$ID] = &$menuItem;
    }
    
    // Remove children from $menuItems so only top level items remain
    foreach (array_keys($menuItems) as $ID)
    {
        if ($menuItems[$ID]['ParentID'] != null)
            unset($menuItems[$ID]);
    }
    
    print_r($menuItems);
    ?>
    
    Array
    (
        [1] => Array
            (
                [ItemText] => Home
                [ItemLink] => index.php
                [ParentID] => 
                [Children] => Array
                    (
                        [2] => Array
                            (
                                [ItemText] => Home Sub 1
                                [ItemLink] => somepage.php
                                [ParentID] => 1
                                [Children] => Array
                                    (
                                    )
    
                            )
    
                        [3] => Array
                            (
                                [ItemText] => Home Sub 2
                                [ItemLink] => somepage2.php
                                [ParentID] => 1
                                [Children] => Array
                                    (
                                    )
    
                            )
    
                    )
    
            )
    
        [4] => Array
            (
                [ItemText] => Contact
                [ItemLink] => contact.php
                [ParentID] => 
                [Children] => Array
                    (
                    )
    
            )
    
    )
    
    $new_array = array();
    foreach ($menuItems as $key => &$menuItem) {
        if (($menuItem['ParentID'] != NULL) && ($menuItem['ParentID'] != '')) {
            $new_array[$menuItem['ParentID']]['Children'][$menuItem['ItemID']] = &$menuItem;
        } else {
            $new_array[$menuItem['ItemID']] = &$menuItem;
        }
    }
    
    print_r($new_array);
    
    <?php
    
    $categories = array(
        '1'=>   array('name'=>'one','parent'=>null),
        '2'=>   array('name'=>'two','parent'=>null),
        '20'=>  array('name'=>'twenty','parent'=>'2'),
        '21'=>  array('name'=>'twenty one','parent'=>'2'),
        '210'=> array('name'=>'two hundred and ten',    'parent'=>'21'),
        '211'=> array('name'=>'two hundred and eleven', 'parent'=>'21'),
        '212'=> array('name'=>'two hundred and twelve', 'parent'=>'21')
    );
    
    $tree=Menu::CreateTree($categories);
    print_r($tree);
    Menu::GenerateMenuHtmlCode($tree);
    
    class Menu
    {   
        public static function GenerateMenuHtmlCode($tree)
        {
            echo '<ul>';
            foreach ($tree as $key=>$value)
            {
                 echo "<li>".$value['name'];
                 if(!empty($value['sons'])) 
                     self::GenerateMenuHtmlCode($value['sons']);
                 echo "</li>";
            }
            echo '</ul>';
        }
    
        public static function CreateTree($categories)
        {
            $tree=array();
            self::AddElement(&$categories,&$tree,null);
            return $tree;
        }
    
        private function AddElement($categories,&$tree,$parent)
        {
            foreach ($categories as $key=>$value)
            {
                if($value['parent']==$parent)
                {
                    $tree[$key]=$categories[$key];
                    $tree[$key]['sons']=array();
                    self::AddElement($categories,&$tree[$key]['sons'],$key);
                }
                if(empty($tree['sons'])) unset ($tree['sons']);
            }
            unset($categories[$parent]);
            return ;
        }
    }
    ?>
    
    Array
    (
        [1] => Array
            (
                [name] => one
                [parent] => 
                [sons] => Array()
            )
    
        [2] => Array
            (
                [name] => two
                [parent] => 
                [sons] => Array
                    (
                        [20] => Array
                            (
                                [name] => twenty
                                [parent] => 2
                                [sons] => Array()
                            )
    
                        [21] => Array
                            (
                                [name] => twenty one
                                [parent] => 2
                                [sons] => Array
                                    (
                                        [210] => Array
                                            (
                                                [name] => two hundred and ten
                                                [parent] => 21
                                                [sons] => Array()
                                            )
    
                                        [211] => Array
                                            (
                                                [name] => two hundred and eleven
                                                [parent] => 21
                                                [sons] => Array()
                                            )
    
                                        [212] => Array
                                            (
                                                [name] => two hundred and twelve
                                                [parent] => 21
                                                [sons] => Array()
                                            )
                                    )
                            )
                    )
            )
    )
    
    <ul>
        <li>one</li>
        <li>two
            <ul>
                <li>twenty</li>
                <li>twenty one
                    <ul>
                        <li>two hundred and ten</li>
                        <li>two hundred and eleven</li>
                        <li>two hundred and twelve</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>