钻孔数组比嵌套循环更好的方法?

时间:2010-11-09 18:42:11

标签: php drupal

我有一个菜单结构(Drupal),其中包含表示菜单链接的元素。如果菜单有一个子菜单(是子菜单的父菜单),它有一个数组键'下面',里面的菜单项具有相同的结构。从理论上讲,这个菜单可能是无限深的,我知道如何通过每个级别的唯一方法是在项目中创建一个新的循环,如果“下方”中有任何内容。我知道必须有一种更优雅和动态的方式来处理这个问题。我不是真的在寻找一个Drupal特定的答案,因为之前出现过这个问题而且我刚刚将它们一起攻击了。谢谢你的阅读!

2 个答案:

答案 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函数。你只需要找到它们。