Smarty - foreach 循环 10 次并停止
Posted
技术标签:
【中文标题】Smarty - foreach 循环 10 次并停止【英文标题】:Smarty - foreach loop 10 times and stop 【发布时间】:2011-03-29 08:15:36 【问题描述】:我正在使用以下 Smarty 代码:
foreach from=$entries key=i item=topic
if $topic.topic_style == question
<li>
<a href="topic.php?id=$topic.id">$topic.title</a>
</li>
/if
/foreach
我怎样才能执行 foreach 最多 10 次然后停止?
【问题讨论】:
【参考方案1】:你可以使用index
和break
函数:
foreach from=$entries key=i item=topic name=foo
if $smarty.foreach.foo.index == 10
break
/if
if $topic.topic_style == question
<li>
<a href="topic.php?id=$topic.id">$topic.title</a>
</li>
/if
/foreach
这里描述了中断功能:
Break in Smarty's / Dwoo's foreach
【讨论】:
需要额外的插件,其他两个解决方案不需要 您可以将 break 替换为 phpbreak;/php 并避免使用该插件。【参考方案2】:你可以使用array_slice
:
foreach $entries|@array_slice:0:10 as $topic
...
/foreach
【讨论】:
我不得不稍微修改语法以使其正常工作 foreach from=$entries|@array_slice:0:10 item=topic【参考方案3】:使用index
:
foreach from=$entries key=i item=topic name=foo
if $smarty.foreach.foo.index < 10
if $topic.topic_style == question
<li>
<a href="topic.php?id=$topic.id">$topic.title</a>
</li>
/if
/if
/foreach
【讨论】:
【参考方案4】:这个例子使用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)
phpbreak;/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 程序员来说,操作员成为第二天性,但对于设计师来说,他们的正常工作可能会变得陌生。
【讨论】:
【参考方案5】:如果你不想写 smarty 插件,你也可以这样做:
foreach from=$entries key=i item=topic name=foo
if $smarty.foreach.foo.index == 10
phpbreak;/php
/if
if $topic.topic_style == question
<li>
<a href="topic.php?id=$topic.id">$topic.title</a>
</li>
/if
/foreach
【讨论】:
【参考方案6】:以上所有都在一定程度上起作用,但不是我想要的。 这对我有用。 我基本都是用foreach的index属性
foreach $products as $product
if $product@index eq 3
break
/if
<img src="..products/$product.product_image" >
/foreach
【讨论】:
【参考方案7】:smarty 中的小扩展以限制 foreach。
存档:sysplugins/smarty_internal_compile_foreach.php
对原始属性添加限制:
public $optional_attributes = array('name', 'key','limit');
在$output = "<?php ";
这个之后添加>
if (isset($_attr['limit']))
$limit = $_attr['limit'];
$output .= "\n \$_limitCnt = 0; \n \$_limit = $limit; \n";
在$output .= "?>";
这个之前添加>
if (isset($_attr['limit']))
$output .= "\n if (\$_limitCnt == \$_limit) break; ";
$output .= "\n \$_limitCnt++;";
像往常一样使用每个并添加 limit=# 来限制您的结果。
希望我能帮上忙。
【讨论】:
【参考方案8】:Smarty 3 有另一种选择,如果可能的话,建议升级。如果您不能,请与您的应用程序的开发人员交谈。
foreach $result_set as $result
if $result@iteration lte 10
// just as in php both forms of access are available.
$result.assoc_key
$result.0
/if
/foreach
同样值得注意的是,Smarty 3 也内置了 break。但是,如果您在结束前从 foreach 循环中中断并基本上丢弃剩余数据,那么您可能需要考虑是否可以限制您的 sql 查询。
【讨论】:
以上是关于Smarty - foreach 循环 10 次并停止的主要内容,如果未能解决你的问题,请参考以下文章