PHP数组得到双打印

时间:2012-01-05 21:51:32

标签: php arrays

我正在尝试使用Wordpress上的Tags / taxonomy在Wordpress中构建一个类似于以下HTML的菜单

期望输出

<ul id="menu-navigation">
    <li class="no-menu"><a href="">Tag 1</a></li>
    <li class="no-menu"><a href="">Tag 2</a></li>
    <li class="no-menu"><a href="">Tag 3</a></li>
    <li class="no-menu"><a href="">Tag 4</a></li>    
    <li><a href="">More <span class="arrow">▾</span></a>
        <ul>
            <li><a href="">tag 5</a></li>
            <li><a href="">tag 6</a></li>
            <li><a href="">tag 7</a></li>
            <li><a href="">tag 8</a></li>
        </ul>
    </li>
</ul>

假设我获得了一个包含20个标签的列表,作为array()

返回给我

目标是上面的HTML输出,请注意..

  • 前4个标签将包含在<li>标签
  • 第五个菜单项应为文字More并且<span class="arrow">▾</span>以及新<ul>
  • 的开头
  • 第5到第20个标签将包含在<li>标签中,但它们将位于子菜单下

到目前为止,我把它放在一起几乎可以给我所需的输出......

<?php
$posttags = array('tag 1', 'tag 2', 'tag 3', 'tag 4', 'tag 5', 'tag 6', 'tag 7',
    'tag 8', 'tag 9', 'tag 10', 'tag 11', 'tag 12', 'tag 13', 'tag 14', 'tag 15',
    'tag 16', 'tag 17', 'tag 18', 'tag 19', 'tag 20');


$count = 0;
if ($posttags) {
    echo '<ul id="menu-navigation">';
    foreach ($posttags as $tag) {
        $count++;
        // If count less then 5 we show the first 4 tags as top level links
        if ($count < 5) {
            echo '<li class="no-menu"><a href="">' . $tag . '</a></li>';
        }
        // The 5th top level link/menu item will be the More link and begin our Sub-menu
        if ($count == 5) {
            echo '<li><a href="">More <span class="arrow">▾</span></a>';
                echo '<ul>';
        }
                    echo '<li class="no-menu"><a href="">' . $tag . '</a></li>';

    }
                echo '</ul>';
             echo '</li>';
    echo '</ul>';
}

这几乎可以帮助我...

<ul id="menu-navigation">
    <li class="no-menu"><a href="">tag 1</a></li>
    <li class="no-menu"><a href="">tag 1</a></li>
    <li class="no-menu"><a href="">tag 2</a></li>
    <li class="no-menu"><a href="">tag 2</a></li>
    <li class="no-menu"><a href="">tag 3</a></li>
    <li class="no-menu"><a href="">tag 3</a></li>
    <li class="no-menu"><a href="">tag 4</a></li>
    <li class="no-menu"><a href="">tag 4</a></li>
    <li><a href="">More <span class="arrow">?</span></a>
        <ul>
            <li class="no-menu"><a href="">tag 5</a></li>
            <li class="no-menu"><a href="">tag 6</a></li>
            <li class="no-menu"><a href="">tag 7</a></li>
            <li class="no-menu"><a href="">tag 8</a></li>
            <li class="no-menu"><a href="">tag 9</a></li>
            <li class="no-menu"><a href="">tag 10</a></li>
            <li class="no-menu"><a href="">tag 11</a></li>
            <li class="no-menu"><a href="">tag 12</a></li>
            <li class="no-menu"><a href="">tag 13</a></li>
            <li class="no-menu"><a href="">tag 14</a></li>
            <li class="no-menu"><a href="">tag 15</a></li>
            <li class="no-menu"><a href="">tag 16</a></li>
            <li class="no-menu"><a href="">tag 17</a></li>
            <li class="no-menu"><a href="">tag 18</a></li>
            <li class="no-menu"><a href="">tag 19</a></li>
            <li class="no-menu"><a href="">tag 20</a></li>
        </ul>
    </li>
</ul>

所以我到目前为止唯一的问题是标签1-4被打印两次

请帮助我纠正这个问题,如果你知道更好的方法,我也很乐意,感谢任何帮助,提前谢谢

2 个答案:

答案 0 :(得分:4)

你需要包装你的决赛:

echo '<li class="no-menu"><a href="">' . $tag . '</a></li>';

在:

if($count > 5) { }

或者,你可以把:

continue;

在两个if语句的末尾。

答案 1 :(得分:1)

您在li时打印$count<4,并且在每次迭代结束时,只打印一次就足够了。这应该可以解决问题:

$count = 0;
if (is_array($posttags)) {
    echo '<ul id="menu-navigation">';
    foreach ($posttags as $tag) {
        $count++;
        // The 5th top level link/menu item will be the More link and begin our Sub-menu
        if ($count == 5) {
            echo '  <li><a href="">More <span class="arrow">▾</span></a>';
            echo '    <ul>';
        }            // Fix indentation for the items in the sub-menu
        if($count > 4) {
            echo '      ';
        }
        echo '  <li class="no-menu"><a href="">' . $tag . '</a></li>';

    }
    if (count($posttags) > 4) {
        echo '    </ul>';
        echo '  </li>';
        echo '</ul>';
    }
}