我有一个菜单结构(Drupal),其中包含表示菜单链接的元素。如果菜单有一个子菜单(是子菜单的父菜单),它有一个数组键'下面',里面的菜单项具有相同的结构。从理论上讲,这个菜单可能是无限深的,我知道如何通过每个级别的唯一方法是在项目中创建一个新的循环,如果“下方”中有任何内容。我知道必须有一种更优雅和动态的方式来处理这个问题。我不是真的在寻找一个Drupal特定的答案,因为之前出现过这个问题而且我刚刚将它们一起攻击了。谢谢你的阅读!
答案 0 :(得分:1)
如果没有您正在使用的数据类型的示例,则难以给出确切的实现,但您描述的一般问题类通常可以通过递归来解决 - 这是一个自我调用的函数。
<?php
function deepPrintArr (array $arr)
{
$output = '';
foreach ($arr as $elem)
{
if (is_array $elem)
{
$output .= deepPrintArr ($elem);
}
else
{
$output .= "<p>$elem</p>\n";
}
}
return ($output);
}
echo (deepPrintArr ($some_deeply_nested_array));
?>
答案 1 :(得分:0)
请花点时间在你的drupal代码中“阅读”/inc/menu.inc。 此文件包含许多非常有用的功能,有些功能在任何文档中都没有提及。 例如,menu_get_active_trail()为您提供活动页面的当前活动路径。这比在您自己的代码中循环遍历所有菜单项要容易得多。
对于这个网站:Qrios我写了一些代码来在Drupal中构建一个两级菜单:
<?php $base_tree = menu_tree_page_data($use_menu);
//Debug
//print_r($tree);
foreach ($base_tree as $item) {
if ($item['link']['in_active_trail'] == 1){
$tree = $item['below'];
}else{
$tree = array(); //empty array
}
} ?>
不确定这是不是你的意思,但是你会想到使用Drupals函数。你只需要找到它们。