【问题标题】:Smarty - foreach loop 10 times and stopSmarty - foreach 循环 10 次并停止
【发布时间】: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 次然后停止?

【问题讨论】:

    标签: foreach smarty


    【解决方案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} 替换为 {php}break;{/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)
             {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}
      

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

          {/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 查询。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-07-13
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多