如果索引匹配计数,则Php foreach返回一个额外的空行

时间:2012-07-30 22:52:25

标签: php foreach

我的foreach有问题,如果“if”条件与索引计数匹配,则会在输出中返回一个额外的空元素。

这是我的代码

<ul id="toplevel" class="menu">
  <?php 
  foreach($categories as $category){
    $parenturl = 'some url'.$category->category_id;
    $parentname = $category->category_name;
  ?>
    <li>
      <?php echo link($parenturl, $parentname); ?>
      <?php if($category->childs) : ?>
      <ul>
        <li>
         <?php echo link($parenturl, $parentname); ?>
          <ul>
          <?php
          $i=0;
          foreach($category->childs as $child){
            $i++;
            $childurl = 'some url'.$child->category_id;
            $childname = $child->category_name;
          ?>
          <li><?php echo link($childurl, $childname); ?></li>
          <?php
          if($i % 10 == 0) :
          ?>
           </ul></li><li><?php echo link($parenturl, $parentname); ?><ul>
          <?php
          endif;
          }
          ?>
          </ul>
        </li>
      </ul>
      <?php endif; ?>
    </li>
  <?php
  }
  ?>
  </ul>

因此,如果$ child只有10个项目,那么输出11,我不知道为什么。

输出如下所示:

<ul id="toplevel" class="menu">
<li>
  <a>Main Category</a>            
  <ul>
    <li>
     <a>Main Category</a>          
     <ul>
        <li><a>Sub 1</a></li>
        <li><a>Sub 2</a></li>
        <li><a>Sub 3</a></li>
        <li><a>Sub 4</a></li>
        <li><a>Sub 5</a></li>
        <li><a>Sub 6</a></li>
        <li><a>Sub 7</a></li>
        <li><a>Sub 8</a></li>
        <li><a>Sub 9</a></li>
        <li><a>Sub 10</a></li>
      </ul>
    </li>
    <li>
    <a>Main Category</a>
    <ul> </ul>
    </li>
  </ul>
</li>
</ul>

我正在玩计数,但每次$ child匹配数字时,它会输出一个。但是,如果$ child的项目数量少于或超过计数,那么它可以正常工作。

HTML看起来像这样,因为我正在使用Design Chemical的jQuery Verical Megamenu并且需要这种布局

1 个答案:

答案 0 :(得分:1)

请考虑以下代码段:

      <?php
      $i=0;
      foreach($category->childs as $child){
        $i++;
        $childurl = 'some url'.$child->category_id;
        $childname = $child->category_name;
      ?>

变量$ i在foreach循环之前定义。在foreach循环内部,$ i在每次迭代时递增。在foreach循环之后,变量$ i将具有等于foreach循环迭代次数的值。由于foreach循环迭代的次数等于$ child中的元素数,$ i也等于$ child中当前元素的循环“聚焦”。

现在考虑以下代码段:

      <?php
      if($i % 10 == 0) :
      ?>
       </ul></li><li><?php echo link($parenturl, $parentname); ?><ul>
      <?php
      endif;
      }
      ?>

这里if语句检查$ i以查看它是否可被10整除。它使用Modulo运算符(%)执行此操作,当左数除以右边时返回余数。如果$ i可被10整除,则Boolean语句为true,脚本将内容添加到“endif”语句中。

这就是为什么当$ child有10个元素时,你的代码会创建一个额外的行。当$ child有20,30或任意数量的可被10整除的元素时,它还会创建一个额外的行。

现在,您的代码会在十的倍数上生成一个额外的标记,以适应下一组十个元素。但是,无论在10的倍数之后数组中是否存在加法元素,代码都会以10的倍数生成此标记。这意味着如果数组恰好有十个元素的倍数,则会收到“空白/空”标记。

考虑这个问题:

<ul id="toplevel" class="menu">
  <?php 
  foreach($categories as $category){
    $parenturl = 'some url'.$category->category_id;
    $parentname = $category->category_name;
  ?>
    <li>
      <?php echo link($parenturl, $parentname); ?>
      <?php if($category->childs) : ?>
      <ul>
        <li>
         <?php echo link($parenturl, $parentname); ?>
          <ul>
          <?php
          $i=0;
          foreach($category->childs as $child){
            $i++;
            $childurl = 'some url'.$child->category_id;
            $childname = $child->category_name;
          ?>
          <li><?php echo link($childurl, $childname); ?></li>
          <?php
          if($i % 10 == 0 && $i < count($category->childs) ) :
          ?>
           </ul></li><li><?php echo link($parenturl, $parentname); ?><ul>
          <?php 
          endif;
          }
          ?> 
          </ul>
        </li>
      </ul>
      <?php endif; ?>
    </li>
  <?php
  }
  ?>
  </ul>

我改变了:

if($i % 10 == 0)

要:

if($i % 10 == 0 && $i < count($category->childs) )

编辑:澄清问题后修改了答案。现在,上面更改的条件语句将检查以确保在创建新标记之前还有其他元素。