这个例子使用index,你会得到11个结果。查看我的笔记
{foreach from=$entries key=i item=topic name=foo} // note (1)
{if $smarty.foreach.foo.index == 10} // notes (2.1, 2.2 and 2.3)
{php}break;{/php} // note (2.4)
{/if}
{if $topic.topic_style == question} // note (3)
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
注意事项
(1)如果不使用密钥,则无需定义
(2.1) 如果你使用 index 循环的开始是 0,使用 iteration 而不是计数器从 1 开始,对于简单的增量计数使用 iteration不是索引。
(2.2) 虽然在 smarty 代码中使用 ==、!= 等很好,但为了便于阅读,最好使用 eq、neq、is、is not、and、or。列表还在继续,完整列表请参见 smarty 文档。
(2.3) 我在上面提到了 11 个结果,使用 index。在上面的示例中会发生这种情况,仅仅是因为数字是 10,要获得 10 的结果来打印中断,您需要使用 9 作为值。
(2.4) 使用 smarty break 代替,你不一定需要编写 smarty 插件,有很多插件可以安装。
(3) 就像在 PHP 中一样,您不需要在变量、整数、常量或布尔值上使用引号,字符串不是这些,应该用引号括起来。
旧版本
{foreach from=$entries item=topic name=foo}
{if $smarty.foreach.foo.iteration eq 10}
{break}
{/if}
{if $topic.topic_style eq "question"}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
我一直在重新考虑这一点,因此我找到了一种方法来完全跳过中断的需要,循环将在最后一次迭代时结束。为什么我之前没有想到这一点,我不知道,但无论如何,这是你可以在不中断的情况下结束循环的最佳方式。 lte 和 le 都是小于等于的意思,和 PHP 一样
您也可以使用 neq(不等于)并将数字设为 11,但如果您在数组中有更多结果,它会简单地跳过迭代 11 并继续到数组的末尾。如果数组中只有 10 项,则可以使用这三种方法中的任何一种,但在这种情况下,为了简单起见,我会坚持使用小于等于运算符。
您现在会注意到,这个 foreach 循环非常易于查看和理解
更好的修订版
{foreach from=$entries item=topic name=foo}
{if $smarty.foreach.foo.iteration lte 10 AND $topic.topic_style eq "question"}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
总结
简而言之,两种方法都可以,我在上面提到了一个选项,它使用带索引的小于运算符,这是评估的首选方法。
但是,通过切换到迭代,您可以实现更直接的循环,您不需要考虑正确的值,它很简单,我想要 10 个结果,所以 iteration eq 10。
这里有点偏题:索引过度迭代的另一个问题是,如果您使用模数,索引将无法正确显示表格,这在 PHP 程序中同样如此。使用带模数的迭代将使您的生活更轻松。它相当于设置一个计数器,因为行索引不会满足您的需要。
通过使用 smarty 操作符而不是 PHP 对应物,您可以编写更具可读性的模板文件。请记住,模板不是为 php 逻辑设计的,它们是为前端设计师设计的。对于 PHP 程序员来说,操作员成为第二天性,但对于设计师来说,他们的正常工作可能会变得陌生。