1

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

这是我的代码

<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 并且需要这种布局

4

1 回答 1

1

考虑这个代码片段:

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

变量 $i 在 foreach 循环之前定义。在 foreach 循环中,$i 在每次迭代时递增 on。在 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 整除。它使用模运算符 ( % ) 执行此操作,该运算符返回左数除以右数时的余数。如果 $i 可以被 10 整除,则布尔语句为真,脚本将内容添加到“endif”语句中。

这就是为什么当 $child 有 10 个元素时您的代码会创建一个额外的行的原因。当 $child 有 20、30 或任意数量的可被 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) )

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

于 2012-07-30T23:05:36.340 回答