【问题标题】:Php Multidimensional array for navigation用于导航的 PHP 多维数组
【发布时间】:2014-04-03 21:20:06
【问题描述】:

需要导航 Html

  • 首页
  • 页数
    • 关于
    • 服务
    • 产品
    • 联系方式
    • 常见问题解答
    • 网站地图
    • 隐私政策
    • 列布局
      • 1 栏
      • 2 列(左侧边栏)
      • 2 列(右侧栏)
      • 3 栏
      • 4 列
  • 我想使用 php 数组和 foreach 循环来输出所需的 html。 我到目前为止的php代码是:

    <?php
        $data = array("navigation");
        $data['navigation']['Home'] = base_url();
        $data['navigation']['Pages'] = base_url('pages');
        $data['navigation']['Pages']['About'] = base_url('pages/about');
        echo '<ul>';
        foreach($data as $nav) {
            foreach($nav as $subNavKey => $subNavHref) {
                echo "<li><a href='$subNavHref'>$subNavKey</a>";
            }
        }
        echo '</ul>';
    ?>
    

    我在想我需要三个嵌套的 foreach 循环,但是当在以下行达到第三个循环时会生成 php 警告/错误:

    $data['navigation']['Home'] = base_url();
    $data['navigation']['Pages'] = base_url('pages');
    

    我不太确定如何测试 3 级深度,例如:

    $data['navigation']['Pages']['About'] = base_url('pages/about');
    

    另外,在适当的位置输出所需的 li 和 ul 标签也给我带来了麻烦。

    【问题讨论】:

    • 你可以拥有的最大深度是多少?
    • 使用递归函数,更好
    • 最大深度与上面 html 中的“1 Column”一样深
    • array("navigation"); 创建一个包含一个元素的数组,即字符串"navigation"。我想你想要$data = array("navigation" =&gt; array());

    标签: php html codeigniter


    【解决方案1】:

    使用递归

    $data['navigation']['Home'] = base_url();
    $data['navigation']['Pages'] = base_url('pages');
    $data['navigation']['Pages']['About'] = base_url('pages/about');
    $data['navigation']['Pages']['About']['Team'] = base_url('pages/team');
    $data['navigation']['Pages']['About']['Team']['Nate'] = base_url('pages/nate');
    
    echo "<ul>"
    print_list($data);
    echo "</ul>"
    
    function print_list($menu) {
      foreach($menu as $key=>$item) {
        echo "<li>";
        if(is_array($item)) {
          echo "<ul>";
          print_list($item);
          echo "</ul>";
        } else {
          echo "<a href='{$val}'>$key</a>";
        }
        echo "</li>";
      }
    }
    

    【讨论】:

      【解决方案2】:
      <?php
      
      function nav($data) {
          $html = '<ul>';
          foreach ($data as $k => $v) {
              if (is_array($v)) {
                  $html .=  "<li>$k" . nav($v) . "</li>";
              }
              else {
                  $html .= "<li><a href='$k'>$v</a>";
              }
          }
          $html .= '</ul>';
          return $html;
      }
      
      echo nav($data);
      

      【讨论】:

      • 您应该将$html .= nav($v); 更改为$html .= "&lt;li&gt;$k". nav($v) ."&lt;/li&gt;";,因为您将失去PagesColumn Layouts
      【解决方案3】:

      递归函数可以完成工作:

      $items = array(
          "Home",
          "Pages" => array(
              "About",
              "Services",
              "Products",
              "Contact",
              "FAQs",
              "Sitemap",
              "Privacy Policy",
              "Column Layouts" => array(
                  "1 Column",
                  "2 Column (Left Sidebar)",
                  "2 Column (Right Sidebar)",
                  "3 Column",
                  "4 Column"
              )
          )
      );
      
      function getMenu($array) {
          foreach($array as $key => $value) {
              if(is_array($value)) {
                  echo "<li>" . $key . "</li>";
                  echo "<ul>";
                  getMenu($value);
                  echo "</ul>";
              } else {
                  echo "<li>" . $value . "</li>";
              }
          }
      }
      echo "<ul>";
      getMenu($items);
      echo "</ul>";
      

      输出:

      【讨论】:

      • 您遇到了一个错误,因为您在主 &lt;ul&gt; 标记之外打印菜单项,例如 &lt;ul&gt;&lt;/ul&gt;&lt;li&gt;Home&lt;/li&gt;&lt;li&gt;Pages&lt;/li&gt;...
      • 您仍然有一个错误,因为您的孩子 &lt;ul&gt; 在父标签 &lt;li&gt; 之外。您必须将echo "&lt;li&gt;" . $key . "&lt;/li&gt;"; echo "&lt;ul&gt;"; getMenu($value); echo "&lt;/ul&gt;"; 更改为echo "&lt;li&gt;" . $key; echo "&lt;ul&gt;"; getMenu($value); echo "&lt;/ul&gt;&lt;/li&gt;";
      【解决方案4】:

      您应该使用递归函数,例如 (Working Demo):

      function makeMenu($array)
      {
          $menu = '';
          foreach($array as $key => $value) {
              if(is_array($value)) {
                  $menu .= '<li>' . $key . '<ul>' . makeMenu($value) . '</ul></li>';
              }
              else {
                  $menu .= "<li><a href='". $value ."'>" . $value ."</a></li>";
              }
          }
          return $menu;
      }
      

      然后这样称呼它:

      $data = array(
          "Home",
          "Pages" => array("About", "Services"),
          "Column Layouts" => array("1 Column", "2 Column (Left Sidebar)")
      );
      echo '<ul>' . makeMenu($data) . '</ul>';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 2019-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多