【问题标题】:PHP Recursive navigationPHP递归导航
【发布时间】:2013-01-17 06:05:20
【问题描述】:

所以我有这个关于递归数组的问题。我想要的是从我的数据库中获取一个带有 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% 确定..

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

提前致谢

【问题讨论】:

    标签: php mysql recursion


    【解决方案1】:

    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;
    }
    

    【讨论】:

    • 感谢一百万,我为使其工作而进行的唯一更改是在 if 语句中 if($item['id'] == $parent) -> if($item[' parent_id'] == $parent)
    【解决方案2】:

    你的代码有一大堆问题...

    首先,您以 3 种不同的方式使用名为 $tree 的变量,我很确定您无意中覆盖了该变量的内容。

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

    看看如果你修复它会发生什么。

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

    第三,当你递归时,你传入了第二个参数,但在函数声明中没有占位符,所以参数消失得无影无踪。

    【讨论】:

    • 试图改变你所说的并理解它的来源,但似乎无法将我的手指缠绕在它周围。每次它都会给我一个空数组..
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多