我的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并且需要这种布局
答案 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) )
编辑:澄清问题后修改了答案。现在,上面更改的条件语句将检查以确保在创建新标记之前还有其他元素。