所以我有关于递归数组的这个问题。我想要的是从我的数据库中获取一个带有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正确,我不认为这是问题,但我不是百分百确定..
我希望这个问题很明确,但如果我不抱歉,我会在需要的地方澄清。
提前致谢
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您的代码存在很多问题......
首先,你以3种不同的方式使用一个名为$tree
的变量,我很确定你会覆盖那个变量的内容而没有意义。
$ tree是你的函数的一个参数,然后它会在行$tree = getPages();
中被覆盖 - 所以传入的任何参数都消失了。然后你将它用作行foreach($tree as $i => $item)
中的迭代器 - 所以再次,那里的任何东西都被覆盖了。
看看如果你解决了这个问题会发生什么。
其次,您的SQL语句检索整个“pages”表,而不是当前页面的子表。
第三,当你递归时,你传递了第二个参数,但在函数声明中没有占位符,所以参数消失得无影无踪。