【问题标题】:Multi-Dimensional Navigation Array多维导航阵列
【发布时间】:2013-02-21 20:54:19
【问题描述】:

尝试使用多维数组和递归构造导航。我有以下代码:

首先,我在 doctype 下的每个单独页面上运行 <?php $title = 'pagename'; ?>(用于主动类检测)

阵列:

<?php

$nav_array = array ('Home' => 'index.php',
                   'About' => array ( 'about.php', array (
                        'Michael' => array( 'michael.php', array (
                            'Blog' => 'blog.php',
                            'Portfolio' => 'portfolio.php')), 
                        'Aaron' => 'aaron.php' , 
                        'Kenny' => 'kenny.php', 
                        'David'=> 'david.php')),

                   'Services' => array ( 'services.php', array (
                        'Get Noticed' => 'getnoticed.php', 
                        'Hosting' => 'hosting.php')),

                   'Clients' => 'clients.php',
                   'Contact Us' => 'contact.php'
    );

    $base = basename($_SERVER['PHP_SELF']);
?>

FOREACH:(生成导航)

<ul>
<?php

foreach ($nav_array as $k => $v) {
    echo buildLinks ($k, $v, $base);    
}
?>
</ul>

构建链接:

<?php // Building the links

function buildLinks ($label_name, $file_name, $active_class) {
    if ($label_name == $title) {
        $theLink = "<li><a class=\"selected\" href=\"$file_name\">$label_name</a></li>\n";
    } else {
        $theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
    }

    return $theLink;
}


?>

结果: http://khill.mhostiuckproductions.com/siteLSSBoilerPlate/arraytest.php

子菜单将出现在使用 CSS 的父元素悬停上。我需要能够在不修改数组之外的任何内容的情况下通过多个子级别。

如何让我的 foreach 递归地遍历数组的其余部分?

(注意:我必须能够将一类活动应用于当前页面,并将一类箭头应用于具有子菜单的父元素。)

【问题讨论】:

    标签: php css html


    【解决方案1】:

    无论你使用什么数据结构来构建你的导航,你都需要让你的函数递归,这里有一个快速而肮脏的方法:

    echo "<ul>";
    foreach ($nav_array as $nav_title => $nav_data) {
      echo buildLinks($nav_title, $nav_data, $base, $title);
    }
    echo "</ul>";
    
    /* NOTE that we pass $title to the function */
    function buildLinks ($label_name, $file_name, $active_class, $title) {
    
      $theLink = '';
      /* this is dirty code, you should reconsider your data structure */
      $navigation_list = false;
      if (is_array($file_name)) {
        $navigation_list = $file_name[1];
        $file_name = $file_name[0];
      }
    
      if ($active_class == $title) {
        $theLink = "<li><a class=\"selected\" href=\"$file_name\">$label_name</a></li>\n";
      } else {
        $theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
      }
    
      if ($navigation_list) {
        $theLink .= "<ul>";
        foreach ($navigation_list as $nav_title => $nav_data) {
          $theLink .= buildLinks($nav_title, $nav_data, $active_class, $title);
        }
        $theLink .= "</ul>";
      }
    
      return $theLink;
    }
    

    无论如何都不是一个干净的解决方案,如果我是你,我会更改数据结构以使其更易于处理。

    【讨论】:

    【解决方案2】:

    我认为这是一个非常糟糕的方式。我建议将您的菜单元素保存为 XML 或 JSON 并使用解析器。这将有助于您的工作。

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 2010-09-06
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      相关资源
      最近更新 更多