【问题标题】:Split menu list in two every 7 items将菜单列表拆分为每 7 个项目中的两个
【发布时间】:2016-08-02 17:24:54
【问题描述】:

我有一个使用引导程序的动态菜单,但一个菜单按钮有大约 14 个子项。对于一个网站来说太长了,所以我想把它分成两半。

这是我要复制的代码:

<ul class="dropdown-menu dropdown-menu-large row" role="menu">
   <li class="col-sm-6">
        <ul>
            <li><a href="life-insurance.html">Life Insurance</a></li>
            <li><a href="life-insurance.html">Home Insurance</a></li>
            <li><a href="life-insurance.html">Travel Insurance</a></li>
            <li><a href="life-insurance.html">Pet Insurance</a></li>
        </ul>
   </li>

   <li class="col-sm-6">
        <ul>
            <li><a href="life-insurance.html">Boat Insurance</a></li>
            <li><a href="life-insurance.html">Auto Insurance</a></li>
            <li><a href="life-insurance.html">Bike Insurance</a></li>
            <li><a href="life-insurance.html">Business Insurance</a></li>
        </ul>
   </li>
</ul>

这是我尝试过的:

$tel = 1;

foreach ( $nmenuccr as $cmenu ) {

    // If id matches and category id is 11 (services) split in half
    if ( $cmenu['id'] && $cmenu['catid'] == '11' ){

        if($tel == 1) {
            $hmenu .= '<li class="col-sm-6"><ul>';  
        }


        $hmenu.= '
                <li><a href="'.$cmenu['alias'].'.html">'.$cmenu['title'].'</a></li>
            ';

        if(($tel % 7) == 0){
            $hmenu .= '</ul></li> <li class="col-sm-6"><ul>'; 
        }
        $tel++;     


        if(($tel % 7) != 0){
            $menu .= '</li>';
        }
    //Else use the normal dropdown layout
    }else{

        if (strlen($cmenu['title']) > 25){  
           $shortstrmen = substr($cmenu['title'], 0, 25) . '...';

           $hmenu.= '
                <li><a href="'.$cmenu['alias'].'.html">'.$shortstrmen.'</a>
            ';
        }else{
        $hmenu.= '
                <li><a href="'.$cmenu['alias'].'.html">'.$cmenu['title'].'</a>
            ';
        }

    }

}

但是这会返回以下代码:

https://jsfiddle.net/sms16v44/

有人看到我做错了吗?

【问题讨论】:

  • 由于您的程序,您的额外标签不合适。例如,您正在循环中间进行 ++ing。您的某些
  • 也缺少结束标记
  • 是的.. @jjonesdesign OP 忘记关闭此行中的 标签 &lt;li&gt;&lt;a href="'.$cmenu['alias'].'.html"&gt;'.$cmenu['title'].'&lt;/a&gt;
  • 感谢我编辑了这篇文章。 @jjonesdesign 我只发现一个错过了结束标签,你指的是哪一个?
  • 如果我删除 UL 标签,它会起作用,但它不会将 col-md-6 类包裹在 7 个项目周围,而是立即关闭。就像你在这里看到的:i.gyazo.com/90dae793d61e068a308a1c6ecb729457.png
  • 在 ++ 之后将 &lt;/li&gt; 添加到 $menu 而不是 $hmenu 是否正确?你能举个$nmenuccr的例子吗?
  • 标签: php html twitter-bootstrap


    【解决方案1】:

    您对类别 ID 11 的检查似乎与您的问题无关,因此我没有在其中包含该逻辑。当您将打开和关闭部分留在循环之外时,事情会变得简单得多。然后,您只输出重复的项目,并检查您放入分隔符的一个案例 ($tel % 4)。

    <?php
    $nmenuccr = [ // sample data
        ["alias"=>"life-insurance", "title"=>"Life Insurance"],
        ["alias"=>"life-insurance", "title"=>"Home Insurance"],
        ["alias"=>"life-insurance", "title"=>"Travel Insurance"],
        ["alias"=>"life-insurance", "title"=>"Pet Insurance"],
        ["alias"=>"life-insurance", "title"=>"Boat Insurance"],
        ["alias"=>"life-insurance", "title"=>"Auto Insurance"],
        ["alias"=>"life-insurance", "title"=>"Bike Insurance"],
        ["alias"=>"life-insurance", "title"=>"Business Insurance"],
    ];
    
    $hmenu = "<li class=\"col-sm-6\">\n\t<ul>\n";
    foreach ($nmenuccr as $tel=>$cmenu) {
        if ($tel % 4 == 0 && $tel > 0) {
            $hmenu .= "\t</ul>\n</li>\n<li class=\"col-sm-6\">\n\t<ul>\n"; 
        }
        $hmenu.= "\t\t<li><a href=\"$cmenu[alias].html\">$cmenu[title]</a></li>\n";
    }
    $hmenu .= "\t</ul>\n</li>";
    echo $hmenu;
    

    输出:

    <li class="col-sm-6">
        <ul>
            <li><a href="life-insurance.html">Life Insurance</a></li>
            <li><a href="life-insurance.html">Home Insurance</a></li>
            <li><a href="life-insurance.html">Travel Insurance</a></li>
            <li><a href="life-insurance.html">Pet Insurance</a></li>
        </ul>
    </li>
    <li class="col-sm-6">
        <ul>
            <li><a href="life-insurance.html">Boat Insurance</a></li>
            <li><a href="life-insurance.html">Auto Insurance</a></li>
            <li><a href="life-insurance.html">Bike Insurance</a></li>
            <li><a href="life-insurance.html">Business Insurance</a></li>
        </ul>
    </li>
    

    【讨论】:

      【解决方案2】:

      尝试任何长度的菜单.....

      <ul class="dropdown-menu dropdown-menu-large row" role="menu">
      <?php
              $counter = 1;
              foreach ($nmenuccr as $cmenu ) {
                  if($counter == 1){
                      echo '<li class="col-sm-6"><ul>';
                  }//.... end of if() .....//
      
                  echo '<li><a href="'.$cmenu['alias'].'.html">'.$cmenu['title'].'</a></li>';
                  $counter ++;
                  if($counter == 5){
                      echo "</ul></li>";
                      $counter = 1;
                  }//.... end of if() .....//
              }//.... end of foreach() .....//
      
      ?>
      </ul>
      

      【讨论】:

        【解决方案3】:

        保留一段垃圾代码,你可以这样快速修复它:

        $tel = 0;
        
        /* .. */
        
        // If id matches and category id is 11 (services) split in half
        if ( $cmenu['id'] && $cmenu['catid'] == '11' ){
        
            if(++$tel == 1) {
                $hmenu .= '<li class="col-sm-6"><ul>';  
            }
        
        
            $hmenu.= '<li><a href="'.$cmenu['alias'].'.html">'.$cmenu['title'].'</a></li>';
        
            if(($tel % 7) == 0){
                if ($tel == 7) {
                    $hmenu .= '</ul></li><li class="col-sm-6"><ul>'; 
                } else {
                    $hmenu .= '</ul></li>';
                }
            }
        //Else use the normal dropdown layout
        } // ..
        

        工作示例(更新): http://sandbox.onlinephpfunctions.com/code/13fd6974cd66c847747f44a4be9b892aa47e4979

        但是你应该通过一个函数重构你的$nmenuccr,这将使它成为一个数组,将菜单的目标结构反映为KISS代码的视图生成部分。

        编辑:更新了$tel上的操作。

        【讨论】:

        • 这是朝着正确的方向发展。唯一的问题是第一个列表有 6 个项目长,第二个 7 个,然后在底部有一个单独的列表项。这是我现在的代码:jsfiddle.net/ouut4pdu foreach 循环外的
            标记需要有 class: dropdown-menu dropdown-menu-large 行,但仅限于正在拆分的菜单上,而不是全部。我该怎么做?
        • 对上面的代码和沙盒示例进行轻微更新。
        • 太棒了,这行得通,但是现在每个菜单下拉菜单都有类:'dropdown-menu dropdown-menu-large row',因为我必须将它添加到 foreachloop 之外的
            标记中,否则菜单看起来坏了。当它在循环之外时,我怎样才能只将它应用于'catid [11]'?
        【解决方案4】:

        如果您也可以将输出数组作为注释包含在内,这将更容易提供帮助。

        但是,试试这个。改变这个:

            if(($tel % 7) != 0){
                $menu .= '</li>';
            }
        

        到:

            if(($tel % 7) != 0){
                $menu .= '</ul></li>';
            }
        

        希望它会起作用

        【讨论】:

          【解决方案5】:

          我没有尝试更改您的代码,而是提出了以下建议。这允许您从菜单中自动创建子菜单。希望对你有帮助。

          它像下面的截图一样创建它:

          和其他功能/方式:

          <?php
          
          // recreating dummy menu data
          function createDummyList() {
              $nmenuccr = array();
              for($i=0;$i<24;$i++) {
                  $a = array();
                  $a['id']=$i;
                  $a['catid']=$i;
                  $a['alias']="alias $i";
                  $a['title']="title $i";
                  array_push($nmenuccr, $a);
              }
              return $nmenuccr;
          }
          
          
          /**
           * Parse a menu into smaller menu's
           * @param type $menu the main menu
           * @param type $class html class
           * @param type $max_sub_items max items before creating a new submenu
           * @param type $submenu (used for recursion)
           * @return string
           */
          function createMenuList(&$menu, $class, $max_sub_items) {    
          
              $out = "<ul class='$class'><li>";
          
              // shift items
              $submenu = array();
              $i=0;
              $loop=0;
              while(count($menu) > 0) {        
          
                  array_push($submenu, array_shift($menu));
          
                  $i++;
                  if ($i == $max_sub_items || count($menu) == 0) {
                      $out .= createList($submenu, $loop);
                      $out .= '<li>In between</li>';
                      $i=0;
                      $submenu = array();
                      $loop++;            
                  }
              }           
          
              $out .= "</li></ul>";
          
              return $out;
          }
          
          /**
           * 
           * @param type $list
           * @param type $submenu_label
           * @return string
           */
          function createList(&$list, $loop) {
          
              $out = '<ul>';
              foreach($list as $l) {
                  $out .= '<li><a href="'.$l['alias'].'.html">'.$l['title'].'</a></li>';    
              }
              $out .= '</ul>';
              return $out;
          }
          
          
          /**
           * Parse a menu into smaller menu's
           * @param type $menu the main menu
           * @param type $class html class
           * @param type $max_sub_items max items before creating a new submenu
           * @param type $submenu (used for recursion)
           * @return string
           */
          function createSubMenuList(&$menu, $class, $max_sub_items, $submenu = 0) {
          
              // create new list
              $out = "<ul class='$class'>";
          
              // shift items
              for($i=0;$i<$max_sub_items;$i++) {              
          
                 $item = array_shift($menu);
          
                  // add item to list
                  if (isset($item)) {
                      $out .= '<li><a href="'.$item['alias'].'.html">'.$item['title'].'</a></li>';   
                  }
              }
          
              // check if we're done
              if (count($menu) > 0) {           
                  $submenu++;
                  $out .= "<li class='submenu_$submenu'>";
                  // create submenu in parent menu
                  $out .= createSubMenuList($menu, $class, $max_sub_items, $submenu);
                  $out .= "</li>";
              }
          
              $out .= "</ul>";
          
              return $out;
          
          }
          
          // call menu creation function
          $list1=createDummyList();
          $list2=createDummyList();
          echo createSubMenuList($list1, 'hoofdmenu', 7);
          echo "<hr />";
          echo createMenuList($list2, 'hoofdmenu', 7);
          
          ?>
          

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多
            热门标签