2013-02-21 70 views
0

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

首先,我的文档类型下的每个单独的页上运行<?php $title = 'pagename'; ?>(用于有源类检测)

ARRAY:

<?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:(产生NAV)

<ul> 
<?php 

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

b uildLinks:

<?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以递归方式落在数组的其余部分?

(注:我有一类的积极应用到当前页面的能力,而类箭头到具有一个子菜单当前父元素。)

回答

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; 
} 

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

+0

数据结构是指数组的结构?你有什么建议,我应该采取什么方式?我可以搜索的东西? – Michael 2013-02-21 22:00:00

+0

当然可以看到:http://stackoverflow.com/questions/11907790/recursive-function-for-dynamic-multilevel-menu-php – nubeiro 2013-02-22 11:28:53

0

我觉得这是一个非常糟糕的方式。我建议将菜单元素保存为XML或JSON并使用解析器。它会方便你的工作。