【问题标题】:trying to get foreach loop to display items with subitems correctly in list items试图让 foreach 循环在列表项中正确显示带有子项的项目
【发布时间】:2015-06-01 21:48:24
【问题描述】:

我真的很想让它工作并且很接近:

它遍历数组并创建子菜单(尽管有错误)但是: 带有子菜单项的第一个菜单正确显示,但在具有子菜单项的第二个菜单上,它重复第一个子菜单项,然后是第二个子菜单项.....我错过了什么?

任何帮助将不胜感激。

    <ul class="nav navbar-nav">
     <?php
            $html = new cacheHTML('topmenu');
            if(!$html->isCached){
            $menuitems = getMenuLevelsArray(25, 1 , 1); 
            $submenuI = "0";

            foreach($menuitems as $item){
                if($item['submenu']){
                    $subs[$submenuI] = $item['submenu'];
                }
         ?>
         <li <?php if($subs[$submenuI]){ ?>  class="dropdown" <?php }?>>
         <a href="<?php echo $item['url']; ?>" <?php if($subs[$submenuI]){ ?>  class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" <?php }?>><?php echo $item['text']; ?><?php if($subs[$submenuI]){ ?>  <span class="caret"></span> <?php }?></a>

                  <!-- submenu begins here -->
                <?php foreach($subs as $submenuI => $menu){ ?>
                    <ul class="dropdown-menu" role="menu">
                        <li>     
                            <?php
                                for($a=0; $a < count($menu); $a++){
                            ?>
                            <a href="<?php echo $menu[$a]['url']; ?>" <?php if(!$menu[$a+1]){ echo "class='last'"; } ?>><?php echo $menu[$a]['text']; ?></a>
                            <?php } ?>                         
                    </li>
                </ul>

                <?php  $submenuI++; } ?>

                </li>
                <?php   
                    }
                 ?>

                <?php } $html->show(); ?>   
    </ul>

   `<ul class="nav navbar-nav">
    <li> <a href="/">Home</a> <br>
        <b>Warning</b>: Invalid argument supplied for foreach() in <b>/layout.php</b> on line 95<br>
    </li>
    <li class="dropdown open"> 
     <a href="/about-us/" class="dropdown-toggle" data-toggle="dropdown" role="button">About<span class="caret"></span></a>
        <ul class="dropdown-menu" role="menu">
            <li>
            <a href="/about/">About</a> 
            <a href="/about/board-of-directors/">Board of Directors</a> 
            <a href="/about/structure/" class="last">Structure</a>
            </li>
        </ul>
    </li>
    <li>
    <a href="/standards-and-codes/standards-and-codes-description/">Standards &amp; Codes</a>
        <ul class="dropdown-menu" role="menu">
            <li>
            <a href="/about/">About</a> 
            <a href="/about/board-of-directors/">Board of Directors</a> 
            <a href="/about/structure/" class="last">Structure</a>                                                 
            </li>
        </ul>
    </li>
    <li class="dropdown">
    <a href="/resources/frequently-asked-questions/" class="dropdown-toggle" data-toggle="dropdown" role="button">Resources <span class="caret"></span></a>
        <ul class="dropdown-menu" role="menu">
            <li>
            <a href="/about/">About</a> 
            <a href="/about/board-of-directors/">Board of Directors</a>
            <a href="/about/structure/" class="last">Structure</a>
            </li>
        </ul>
        <ul class="dropdown-menu" role="menu">
            <li>
            <a href="/resources/frequently-asked-questions/">Frequently Asked Questions</a>
            <a href="/news/news-archives/">News Archives</a>
            <a href="/resources/resources/">Resource Links</a>
            <a href="/safety-alerts/safety-alerts/" class="last">Safety Alerts</a>
            </li>
        </ul>
    </li>
    <li><a href="/contact-us/">Contact Us</a>
        <ul class="dropdown-menu" role="menu">
            <li>
            <a href="/about/">About</a> 
            <a href="/about/board-of-directors/">Board of Directors</a> <a href="/about/structure/" class="last">Structure</a>
            </li>
        </ul>
        <ul class="dropdown-menu" role="menu">
            <li>
            <a href="/resources/frequently-asked-questions/">Frequently Asked Questions</a>
            <a href="/news/news-archives/">News Archives</a>
            <a href="/resources/resources/">Resource Links</a>
            <a href="/safety-alerts/safety-alerts/" class="last">Safety Alerts</a>
            </li>
        </ul>
    </li>
    </ul>` 

【问题讨论】:

  • 您能否在问题中发布结果输出以帮助描述?
  • 是的....谢谢安迪,我已经添加了结果:
  • 你为什么$submenuI++?这是在foreach($subs as $submenuI =&gt; $menu) 循环内。还有,95是哪一行?
  • 第 95 行是 $menu){ ?> 我使用 $submenuI++ 来增加整数。

标签: php arrays loops foreach


【解决方案1】:

在第一个“foreach”循环下,您应该重置 $subs 数组以确保它为空。否则它会进入第二个循环,从前一个循环中看到旧的“$subs”,然后再次循环:

foreach ( $menuitems as $item ) {    
    $subs = array();
    if ($item ['submenu']) {
        $subs [$submenuI] = $item ['submenu'];
    }
...

我发现 PHP 和 HTML 的混合很难阅读,所以我重写了代码以使其更容易阅读:

$html = new cacheHTML ( 'topmenu' );
if (! $html->isCached) {
    $menuitems = getMenuLevelsArray ( 25, 1, 1 );
    $submenuI = "0";

    foreach ( $menuitems as $item ) {
        if ($item ['submenu']) {
            $subs [$submenuI] = $item ['submenu'];
        }

        echo '<li';
        if($subs[$submenuI]){ 
            echo 'class="dropdown"';
        }
        echo ">
        <a href='{$item['url']}'";

        if($subs[$submenuI]){ 
            echo 'class="dropdown-toggle" data-toggle="dropdown"    role="button" aria-expanded="false"';
        }
        echo ">{$item['text']}";

        if($subs[$submenuI]){
            echo '<span class="caret"></span>';
        }
        echo '</a> <!-- submenu begins here -->
                ';

        foreach($subs as $submenuI => $menu){
            echo '<ul class="dropdown-menu" role="menu">
                <li>
                    ';     

            for($a = 0; $a < count ( $menu ); $a ++) {
                echo "<a href='{$menu[$a]['url']}'";
                if(!$menu[$a+1]){ 
                    echo "class='last'"; 
                } 
                echo ">{$menu[$a]['text']}</a>
                ";
            }
            echo '</li>
                </ul>
                ';

            $submenuI++; 
        }
        echo '</li>';

    }

} 

$html->show(); ?>
</ul>

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    终于明白了... 我需要学习更多 PHP if 语句和 foreach 的

    这就是我所做的:

        <ul class="nav navbar-nav">
         <?php
            $html = new cacheHTML('topmenu');
            if(!$html->isCached){
            $menuitems = getMenuLevelsArray(25, 1 , 1); 
            $submenuI = "0";
    
            foreach($menuitems as $item){
                if($item['submenu']){
                    $subs[$submenuI] = $item['submenu'];
                }
         ?>
         <li <?php if($subs[$submenuI]){ ?>  class="dropdown" <?php }?>>
         <a href="<?php echo $item['url']; ?>" <?php if($subs[$submenuI]){ ?>  class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" <?php }?>><?php echo $item['text']; ?><?php if($subs[$submenuI]){ ?>  <span class="caret"></span> <?php }?></a>
    
                  <!-- submenu begins here -->
                <?php foreach($subs as $submenuI => $menu){ ?>
                    <ul class="dropdown-menu" role="menu">
                        <li>     
                            <?php
                                for($a=0; $a < count($menu); $a++){
                            ?>
                            <a href="<?php echo $menu[$a]['url']; ?>" <?php if(!$menu[$a+1]){ echo "class='last'"; } ?>><?php echo $menu[$a]['text']; ?></a>
                            <?php } ?>                         
                    </li>
                </ul>
    
                <?php  $submenuI++; } ?>
    
                </li>
                <?php   
                    }
                 ?>
    
                <?php } $html->show(); ?>   
        </ul>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多