【发布时间】:2013-11-05 04:37:34
【问题描述】:
我的情况和这个帖子很相似
PHP: nested menu with a recursive function, expand only some nodes (not all the tree)
我需要一些帮助...
这是我的 $menuJSONArray 变量的(部分)内容(在调用函数时使用):
Array
(
[0] => Array
(
[Menu_IDX] => 1
[Order] => 1
[Name] => History
[Parent] =>
[Path] => History
[Link] =>
)
[1] => Array
(
[Menu_IDX] => 2
[Order] => 25
[Name] => Review
[Parent] =>
[Path] => Review
[Link] => Review
)
[2] => Array
(
[Menu_IDX] => 3
[Order] => 35
[Name] => Past Medical History
[Parent] =>
[Path] => Past Medical History
[Link] => Past Medical History
)
[3] => Array
(
[Menu_IDX] => 4
[Order] => 45
[Name] => Item 1
[Parent] => 0
[Path] => Item 1
[Link] => Item 1
)
[4] => Array
(
[Menu_IDX] => 5
[Order] => 55
[Name] => Item 2
[Parent] => 0
[Path] => Item 2
[Link] => Item 2
)
[5] => Array
(
[Menu_IDX] => 6
[Order] => 65
[Name] => Item 3
[Parent] => 0
[Path] => Item 3
[Link] => Item 3
)
)
等等……
我正在使用下面的函数,但我一直卡在第一项的循环中。真的需要一些帮助来让我的大脑围绕这个功能。提前谢谢大家,这个社区太棒了!!
///RECURSIVE MENU
function recursive($parent, $array) {
$has_children = false; //set value of has children to false by default
foreach($array as $key => $value) { //loop through the array as key-value pairs
if ($value['Parent'] == $parent) { //if the value of Parent field is equal to parent variable
if ($has_children === false && $parent) { //if children is false but parent is not null, this is a sub item
$has_children = true; //children is true
echo '<ul>' ."\n"; //create parent menu ul
} //otherwise just create the item
echo '<li>' . "\n"; //create li for parent menu item
echo '<a href="'.$value['Path'].'">' . $value['Name'] . '</a>' . " \n"; //create link for menu item
recursive($key, $array); //create sub menu
echo "</li>\n"; //end parent menu item
}
}
if ($has_children === true && $parent) echo "</ul>\n"; //end parent menu
}
?>
<?php echo recursive(0, $menuJSONArray); ?></ul>
我得到的回报是:
<ul>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
似乎无法摆脱这个循环。谢谢!!
附:我不关心引用帖子中树的折叠等,因为我将使用 jquery 和 css 处理它。我就是无法正确输出菜单语法。
【问题讨论】:
-
就个人而言,为什么不在数组中使用额外的级别来表示父/子关系:
[{"name":"Top Level","path":"/path","children":[{"name":"child","path":"/path/child"}]},{"name":"No Children","path":"/childless"}] -
在递归函数中使用循环可能很危险。循环是递归的本质,因此从循环内部调用递归函数可能不会产生您期望的结果。您还使用
foreach循环作为键/值对来迭代具有数字索引的数组,这是有问题的,因为当您从循环中调用递归函数时,您不会增加/更改数组键被传递到递归调用中,因此您将相同的数组节点传递到函数中,从而形成无限循环。 -
@Tim Withers:我想过这个,但是,我正在构建的数组来自数据库(不是 SQL,否则这很容易),我想防止不得不更改客户端的数据库结构。不过感谢您的意见。
-
@KeonRamezani:好的,这很有帮助。我将不得不考虑一下。递归往往会让我的大脑陷入循环!我之前在最后有一个增量,我得到了相同的结果,所以我知道我没有正确实现它。首先的想法是重新形成 foreach 删除键值,这是有道理的,为什么不会在那里产生正确的结果。
-
您可以查看此评论。 stackoverflow.com/questions/23916237/…
标签: php recursion multidimensional-array menu