Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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_Loops_Multidimensional Array - Fatal编程技术网

Php 通过反复处理同一函数来创建多维数组

Php 通过反复处理同一函数来创建多维数组,php,loops,multidimensional-array,Php,Loops,Multidimensional Array,我正在尝试创建一个多维导航数组。我的所有页面都在CMS中创建,然后存储在我的数据库中。每个页面都会有标题、url等常用字段,但也会有一个字段告诉我它是否有子页面“p_has_children”,还有一个字段告诉我它的父页面“p_parent”(如果它是页面的子页面) 我想我可以编写一个函数,我可以调用它并向它发送一个包含所有顶级导航项的数组。然后,当我循环遍历每个项目时,我会检查它是否有子项,获取子项(并将它们分配到一个数组),然后通过相同的函数发送它们,就像这样 function sideNa

我正在尝试创建一个多维导航数组。我的所有页面都在CMS中创建,然后存储在我的数据库中。每个页面都会有标题、url等常用字段,但也会有一个字段告诉我它是否有子页面“p_has_children”,还有一个字段告诉我它的父页面“p_parent”(如果它是页面的子页面)

我想我可以编写一个函数,我可以调用它并向它发送一个包含所有顶级导航项的数组。然后,当我循环遍历每个项目时,我会检查它是否有子项,获取子项(并将它们分配到一个数组),然后通过相同的函数发送它们,就像这样

function sideNavArray()
{
    //Get the side navigation
    $getSidenav = $this->crud_model->fetch_rows_where('pages', array('p_side_nav' => 'y', 'p_active' => 'y'));
    //Call the navbuilder function
    $sidenav = $this->sidenavBuilder($getSidenav, 'navitem', 'nav');
    //return the generated nav
    return $sidenav;

}

function sidenavBuilder($navItems, $itemClass, $navLevel, $i = 0, $sidenav = array())
{
    //Loop over each nav item
    foreach($navItems as $navItem){
        //For each item I want to add th nav_title, slug, url and page type
        $sidenav[$i]['p_nav_title'] = $navItem->p_nav_title;
        $sidenav[$i]['p_slug'] = $navItem->p_slug;
        $sidenav[$i]['p_url'] = $navItem->p_title;
        $sidenav[$i]['p_type'] = $navItem->p_type;

        //See if this page has any children
        if($navItem->p_has_children == 'y'){

            //If the page has children then I want to fetch them from the DB
            $subnav = $this->crud_model->fetch_rows_where('pages', array('p_parent' => $navItem->id, 'p_active' => 'y', 'p_protected !=' => 'y'));

            if(!empty($subnav)){

                //Change the item class and level to subnavitem and subnav 
                $itemClass = 'sub' . $itemClass;
                $navLevel = 'sub' . $navLevel;

                //Assign the children to the same array as its parent in the "subnav" level and send it through the sitenavBuilder function
                $sidenav[$i][$navLevel] = $this->sitenavBuilder($subnav, $itemClass, $navLevel);
            }
        }

    $i++;
    //End foreach loop
    }
return $sidenav;
}
我相信你们中的一些人现在看到了这一点,并且说,当然,这是行不通的

我目前有一个导航正在生成,但它是在前端,每次我想添加一个额外的水平,我必须进入代码,并手动添加它。我希望避免编写每个级别的导航,因为我希望它能够增长到尽可能多的级别,而无需每次都需要编写额外的级别


我希望这一切都有意义。基本上,我想知道是否有一种方法可以通过反复运行相同的循环来构建这个导航阵列,直到不再需要。

可能值得一看。首先,它将仅从一个查询的结果构建树,不需要递归。不确定这是否只是一个输入错误,但“sidenavBuilder”与“sitenavBuilder”可能是一个问题。看起来你已经有了一个递归函数,它应该可以工作了(虽然打字错误使它不是递归的…)谢谢Wrikken,我刚刚看了一下,但想问一下,这是否允许导航增长到5级深?Michael Wheeler,你已经搞定了。非常感谢。我相信你能体会到与代码如此接近而看不到小错误的感觉。再次感谢。@matty:这个答案让它发展到无限的深度。