迭代菜单的多维数组

时间:2013-08-06 12:33:07

标签: php arrays codeigniter multidimensional-array

你好我有一个用codeigniter制作的菜单。但我也希望这有子菜单的

因此,我得到一个数组,并使用foreach循环完成它。

        <ul>
            <?php foreach ($menu_item as $menu =>& $key): ?>    
            <li><?php echo anchor($menu, $key, $this->uri->slash_segment(1, 'leading') == $menu ? 'class="active"' : '') ?></li>
            <?php endforeach ?>
        </ul>

现在的问题是,如果它只有一个没有子菜单的菜单,但是当我得到这样的数组时,它的效果很好

$menu_item = array(
    '/' => 'Home',
    '/about' => 'About',
    '/foo' => 'boo',
    '/contact' => 'contact',
    'test' => array(
               'foo' => 'boo'
              ),

    'test2' => 'foo2'
);

比它不再起作用了。如何循环浏览所有内容并将其作为一个好的菜单输出?

5 个答案:

答案 0 :(得分:2)

您可以使用递归来完成这项工作。如果你不熟悉它,需要一点时间,但它非常适合这种问题。

我没有在PHP中运行此代码,但它会给你一个想法。

基本上发生的是主菜单功能检查每个项目以查看它是否是数组,然后使用子菜单再次调用该功能。如果需要,这将无限深入。

<?php
  $menu = array(
      '/' => 'Home',
      '/about' => 'About',
      '/foo' => 'boo',
      '/contact' => 'contact',
      'test' => array(
                 'foo' => 'boo'
                ),

      'test2' => 'foo2'
  );
?>

<ul>
  <?php showMenu($menu); ?>
</ul>


<?php
  function showMenu($menu)
  {
    <?php foreach ($menu_item as $menu =>& $key): ?>    
      <li><?php echo anchor($menu, $key, $this->uri->slash_segment(1, 'leading') == $menu ? 'class="active"' : '') ?></li>
      if(is_array($menu_item))
      {
        echo "<ul>";
        showMenu($menu_item);
        echo "</ul>";
      }
    <?php endforeach ?>
  }
?>

希望这有帮助。

答案 1 :(得分:1)

您可以检查 $ key 是否为数组:is_array

然后你可以使用另一个 foreach 来遍历子菜单。

答案 2 :(得分:1)

其他答案的概念是正确的,但它们会生成无效的DOM结构,所以我决定修复它。

您可以制作helper文件并将drawMenu()功能放入其中。因此,您可以根据需要调用该函数。

$menu = array(
    '/'        => 'Home',
    '/about'   => 'About',
    '/foo'     => 'boo',
    '/contact' => 'contact',
    'test'     => array(
        'foo' => 'bar',
        'baz' => 'qux'
    ),
    'test2' => 'foo2'
);

function drawMenu($menu)
{
    $CI =& get_instance();

    $output = '';
    foreach ($menu as $key => $value) {
        $output .= "<li>";
        if (is_array($value)) {
            $output .= anchor('#', $key);
            $output .= PHP_EOL."<ul>".PHP_EOL;
            $output .= drawMenu($value);
            $output .= "</ul>".PHP_EOL."</li>".PHP_EOL;
        } else {
            $output .= anchor($key, $value, $CI->uri->slash_segment(1, 'leading') == $key ? 'class="active"' : '');
            $output .= "</li>".PHP_EOL;
        }
    }
    return $output;
}

$html = drawMenu($menu);
echo '<ul>'. $html .'</ul>';

旁注:用法PHP_EOL常量是任意的,它只会使生成的DOM更具可读性。


<强>更新

我改进了drawMenu()功能,现在您可以为子菜单的标题添加URL地址:

$menu = array(
    '/'        => 'Home',
    '/about'   => 'About',
    '/foo'     => 'boo',
    '/contact' => 'contact',
    'test'     => array(
        'foo' => 'bar'
    ),
    'This is Test2|/url/to/test2' => array(
        'baz' => 'qux'
    )
);

您可以在|分隔符后添加网址。

function drawMenu($menu)
{
    $CI =& get_instance();

    $output = '';
    foreach ($menu as $key => $value) {
        $output .= "<li>";

        if (is_array($value)) {

            if (strpos($key, '|') !== false) {
                $param = explode('|', $key);
                $output .= anchor($param[1], $param[0]);
            } else {
                $output .= anchor('#', $key);
            }

            $output .= PHP_EOL."<ul>".PHP_EOL;
            $output .= drawMenu($value);
            $output .= "</ul>".PHP_EOL."</li>".PHP_EOL;
        } else {
            $output .= anchor($key, $value, $CI->uri->slash_segment(1, 'leading') == $key ? 'class="active"' : '');
            $output .= "</li>".PHP_EOL;
        }
    }
    return $output;
}

答案 3 :(得分:0)

试试这个

<ul>
<?php function buildmenu($menu_item){ ?>
    <?php foreach($menu_item as $item){ ?>
            <li><?php echo anchor($menu, $key, $this->uri->slash_segment(1, 'leading') == $menu ? 'class="active"' : '') ?></li>
            <?php if(is_array($item)){ 
                    buildmenu($item); 
            } ?>
    <?php } ?>
<php} ?>
<?php buildmenu($menu_item) ?>
</ul>

答案 4 :(得分:0)

$menu = "<ul>\n";
foreach ($menu_item as $key => $value){
    if (is_array($value)){
        $menu.= "\t<li>".$key."\n\t\t<ul>\n";
        foreach ($value as $key2 => $value2){
            $menu .= "\t\t\t<li>".$value2."</li>\n";
        }
        $menu.= "\t\t</u>\n\t</li>\n";
    } else {
        $menu .= "\t<li>".$value."</li>\n";
    }
}
$menu .= "</ul>";
echo $menu;

输出:

<ul>
    <li>Home</li>
    <li>About</li>
    <li>boo</li>
    <li>contact</li>
    <li>test
        <ul>
            <li>boo</li>
        </u>
    </li>
    <li>foo2</li>
</ul>