我使用以下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次然后停止?
答案 0 :(得分:29)
您可以使用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}
此处描述了中断功能:
答案 1 :(得分:22)
您可以使用array_slice
:
{foreach $entries|@array_slice:0:10 as $topic}
...
{/foreach}
答案 2 :(得分:8)
使用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}
答案 3 :(得分:4)
此示例使用索引,您将获得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)如果你使用索引,循环的开始是0,使用迭代而不是计数器从1开始,对于简单的增量计数使用迭代不是索引。
(2.2)虽然你可以在智能代码中使用==,!=等等,但为了便于阅读,最好使用 eq,neq,is,is,and,或。列表继续,请参阅smarty文档以获取完整列表。
(2.3)我在上面提到了11个结果,使用索引。在上面的示例中会出现这种情况,因为数字为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相同&lt; =
您也可以使用 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个结果,所以迭代eq 10 。
这里有轻微的侧面跟踪:索引重复的另一个问题是如果使用模数,索引将不会正确显示表格。在PHP程序中也是如此。使用模数迭代将使您的生活更轻松。它相当于设置一个计数器,因为行索引不会做你需要的。
通过使用smarty运算符而不是PHP对应运算符,您可以编写更易读的模板文件。请记住,模板不适用于php逻辑,它们适用于前端设计人员。对于PHP程序员来说,操作员成为第二天性,但对于设计师而言,他们可能与他们的正常工作不同。
答案 4 :(得分:2)
如果你不想编写smarty插件,你也可以这样做:
{foreach from=$entries key=i item=topic name=foo}
{if $smarty.foreach.foo.index == 10}
{php}break;{/php}
{/if}
{if $topic.topic_style == question}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
答案 5 :(得分:1)
以上所有内容都在一定程度上起作用了,但并不是我想要的。 这对我有用。 我基本上使用了foreach的index属性
{foreach $products as $product}
{if $product@index eq 3}
{break}
{/if}
<img src="..products/{$product.product_image}" alt="">
{/ foreach}
答案 6 :(得分:0)
聪明的小范围限制foreach。
档案:sysplugins / smarty_internal_compile_foreach.php
为原始属性添加限制:
public $optional_attributes = array('name', 'key','limit');
在$output = "<?php ";
此&gt;
if (isset($_attr['limit'])) {
$limit = $_attr['limit'];
$output .= "\n \$_limitCnt = 0; \n \$_limit = $limit; \n";
}
在$output .= "?>";
之前添加&gt;
if (isset($_attr['limit'])) {
$output .= "\n if (\$_limitCnt == \$_limit) { break; }";
$output .= "\n \$_limitCnt++;";
}
每个用作usuall并添加限制=#以限制结果。
希望我帮助过。
答案 7 :(得分:0)
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查询。