0

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

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

提前致谢

4

2 回答 2

3

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;
}
于 2013-01-16T21:17:43.320 回答
1

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

首先,您使用以$tree3 种不同方式命名的变量,我很确定您正在覆盖该变量的内容而没有意义。

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

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

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

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

于 2013-01-16T22:05:20.167 回答