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】:

你可以使用indexbreak函数:

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

我一直在重新考虑这一点,因此我找到了一种方法来完全跳过中断的需要,循环将在最后一次迭代时结束。为什么我之前没有想到这一点,我不知道,但无论如何,这是你可以在不中断的情况下结束循环的最佳方式。 ltele 都是小于等于的意思,和 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 = "&lt;?php ";这个之后添加>

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++;";

像往常一样使用每个并添加 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 次并停止的主要内容,如果未能解决你的问题,请参考以下文章

smarty foreach循环

Smarty标签运算,控制结构[if,for,foreach,section,while]

Smarty foreach 不工作

数字格式在 Smarty 的 foreach 中不起作用

Smarty

smarty块名可以从smarty变量派生吗