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が設定された数と一致するたびに、もう1つ出力されます。ただし、$ childのアイテム数がカウントより少ないか多い場合は、正常に機能します。

DesignChemicalのjQueryVericalMegamenuを使用していて、このレイアウトが必要なため、HTMLは次のようになります。

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で均等に割り切れる場合、ブールステートメントはtrueであり、スクリプトは内容を「endif」ステートメントに追加します。

これが、$ childに10個の要素がある場合に、コードが余分な行を作成する理由です。また、$ childに20、30、または10で割り切れる任意の数の要素がある場合は、余分な行が作成されます。

今、あなたのコードは、次の10個の要素のセットに対応するために、10の倍数で追加のタグを生成します。ただし、コードは、配列内に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) )

編集:質問を明確にした後、回答を修正しました。上記の変更された条件ステートメントは、新しいタグを作成する前に、追加の要素があることを確認するようになりました。

于 2012-07-30T23:05:36.340 に答える