web-dev-qa-db-ja.com

Smarty-foreachループを10回実行して停止します

次の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回実行してから停止するにはどうすればよいですか?

14
CLiown

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}

ブレーク機能はここで説明されています:

Smarty/Dwooのforeachの中断

30
hsz

array_sliceを使用できます:

{foreach $entries|@array_slice:0:10 as $topic}
  ...
{/foreach}
23
acme

使用 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}
8
Dominic Rodger

この例では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 not index

(2.2)smartyコードでは==、!=などを使用しても問題ありませんが、読みやすくするために、eq、neq、is、is not、and、or。を使用することをお勧めします。で、完全なリストについては、Smartyのドキュメントを参照してください。

(2.3)indexを使用して、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}

私はこれを再考しており、その結果、完全に中断する必要性をスキップする方法を見つけました。ループは最後の反復で終了するだけです。なぜ私は以前にこれを考えなかったのか私は知りませんが、とにかくここがあなたが壊れることなくループを終わらせることができる最良の方法です。 lteleはどちらも以下を意味し、PHP <=

neq(等しくない)を使用して数値を11にすることもできますが、配列にさらに結果がある場合は、反復11をスキップして、配列の最後まで続行します。配列にアイテムが10個しかない場合は、3つの方法のいずれかを使用できますが、この例では簡単にするために、等しくない演算子を使用します。

この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 1であると考える必要はありません。

ここにわずかなサイドトラック:反復に対するインデックスのもう1つの問題は、モジュラスを使用している場合、インデックスがテーブルを正しく表示しないことです。これは、PHPプログラムでも同様です。反復を使用するモジュラスを使用すると、作業が楽になります。行インデックスでは必要な処理が実行されないため、カウンターを設定するのと同じです。

PHPの対応物ではなく、賢い演算子を使用することで、より読みやすいテンプレートファイルを作成できます。テンプレートはphpロジック用ではなく、フロントエンドデザイナー向けであることに注意してください。 PHPプログラマーのオペレーターは第二の性質になりますが、デザイナーにとっては通常の作業とは異なるかもしれません。

4
Chris

スマートプラグインを作成したくない場合は、これも実行できます。

{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} 
2
Zsolti

上記のすべてはある程度機能しましたが、私が望んでいたものとは異なります。これが私のために働いたものです。基本的にforeachのindexプロパティを使用しました

{foreach $products as $product}
{if $product@index eq 3}
    {break}
{/if}
<img src="..products/{$product.product_image}" alt="">

{/ foreach}

1
Maxximum Rider

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}

Smarty3にも{break}が組み込まれていることも注目に値します。ただし、終了前にforeachループから抜け出し、残りのデータを本質的に破棄する場合は、SQLクエリを制限できるかどうかを検討することをお勧めします。

0
Chris