繁体   English   中英

PHP递归导航

[英]PHP Recursive navigation

所以我有关于递归数组的问题。 我想要的是从数据库中获取一个PHP递归数组,这样我就可以创建带有子菜单的导航菜单,而无需创建另一个表。

这是我到目前为止的功能;

function getMenu($tree = null){
        $tree2 = array();
        $tree = getPages();
        foreach($tree as $i => $item){
            if($item->parent_id == $item->ID){
                $tree2[$item->ID] = $item;
                $tree2[$item->ID]['submenu'] = getMenu($tree, $item->ID);
            }
        }

        return $tree2;
    }

为了清楚起见,我不是自己创建此功能的,而是从http://www.jugbit.com/php/php-recursive-menu-with-1-query/获得的,并在我认为合适的地方进行了调整

$ tree变量来自此函数;

function getPages($limit = null,$sort = null) {
     global $db;
     $query = $db->prepare('SELECT * FROM pages ORDER BY Position');
     $query->execute();
     return $query->fetchAll(PDO::FETCH_CLASS);
}

现在,过去两天来,我一直在努力解决问题,以弄清我做错了什么。

如果我打印getMenu函数,我得到的只是一个空数组,但我不知道为什么。 它确实得到了正确的foreach,我不认为这是问题,但我不确定100%。

我希望这个问题很清楚,但如果不是这样,我很抱歉,并将在需要的地方澄清。

提前致谢

getPages ,如果希望它返回一个关联数组,则需要执行以下操作:

return $query->fetchAll(PDO::FETCH_ASSOC);

然后您的getMenu看起来像:

function getMenu($tree = null, $parent = 0) {
    if (!isset($tree))
        $tree = getPages();

    $tree2 = array();
    foreach($tree as $i => $item) {
        if($item['id'] == $parent) {
            $tree2[$item['id']] = $item;
            $tree2[$item['id']]['submenu'] = getMenu($tree, $item['id']);
        }
    }

    return $tree2;
}

您的代码有很多问题...

首先,您可以通过3种不同的方式使用名为$tree的变量,而且我很确定您会覆盖该变量的内容而没有任何意义。

$ tree是函数的参数,然后在$tree = getPages();行中覆盖它$tree = getPages(); -因此,传入的任何参数都消失了。 然后,将其用作foreach($tree as $i => $item)行中的迭代器-因此,这里的内容再次被覆盖。

查看如果解决此问题会发生什么。

其次,您的SQL语句检索整个“页面”表,而不是当前页面的子代。

第三,当您递归时,您传入了第二个参数,但是在函数声明中没有该占位符,因此该参数逐渐消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM