【问题标题】:Better method to drill through array than nested loop?比嵌套循环更好的遍历数组的方法?
【发布时间】:2010-11-09 18:42:11
【问题描述】:

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

【问题讨论】:

标签: php drupal


【解决方案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));
?>

【讨论】:

    【解决方案2】:

    请花时间“阅读”您的 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 函数的想法。你只需要找到它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多