このマニュアルはSmartyのものです。セキュリティなどの問題でRCMSでは利用できないものもありますので、ご注意ください。
{foreach},{foreachelse}  {foreach},{foreachelse}
  {foreach}  を使用して、通常の数値添字配列と同じように
   連想配列   をループします。
   {section}  
  のように、数値添字の配列のみ   をループさせるということはありません。
   {foreach}  の構文は
   {section}  
   よりずっと簡単ですが、その代わりに 1つの配列  
   しか扱えません。すべての {foreach}  タグは、
   終了タグ {/foreach}  とペアである必要があります。
   
   必須の属性は from   と item   です。
   
   {foreach}  ループの name  
   は、英数字とアンダースコアを使用して自由に命名できます。これは
    PHP の変数 
   と同じです。
   
   {foreach}  ループはネスト可能で、ネストした
   {foreach}  の name はお互いにユニークである必要があります。
   
   from   属性は、通常は値の配列で、
   {foreach}  のループ回数を決定するために使われます。
   
   {foreachelse}  は、
   from   変数の値が存在しない場合に実行されます。
   
      {foreach}  ループは、プロパティを操作する変数を自身で持っています。
      これらは次のように表されます。
      
      {$smarty.foreach.name.property}  
      ここで、"name"  は
      name   属性の値となります。
      
注意:  name   属性が必要となるのは
      {foreach } のプロパティにアクセスする必要がある場合のみです。
      これは {section}  
      の場合とは異なります。{foreach}  のプロパティに対して
      定義されていない name   でアクセスしてもエラーは発生しませんが、
      結果は予測できない値になります。
      
    {foreach}  のプロパティには
    index  、
    iteration  、
    first  、
    last  、
    show  、
    total  
    があります。
    
例 7-5. item   属性 
<?php $arr  = array( 1000 ,  1001 ,  1002 ); $smarty -> assign ( 'myArray' ,  $arr ); ?> 
 
$myArray   を順序なしリストで出力するテンプレート
<ul>
{foreach from=$myArray item=foo}
    <li>{$foo}</li>
{/foreach}
</ul> 
   出力
  
<ul>
    <li>1000</li>
    <li>1001</li>
    <li>1002</li>
</ul> 
例 7-6. item   および key   属性の説明 
<?php $arr  = array( 9  =>  'Tennis' ,  3  =>  'Swimming' ,  8  =>  'Coding' ); $smarty -> assign ( 'myArray' ,  $arr ); ?> 
 
$myArray   を キー/値 のペアで出力するテンプレート。
   PHP の foreach   と似ています。
<ul>
{foreach from=$myArray key=k item=v}
   <li>{$k}: {$v}</li>
{/foreach}
</ul> 
   出力
  
<ul>
    <li>9: Tennis</li>
    <li>3: Swimming</li>
    <li>8: Coding</li>
</ul> 
例 7-7. {foreach} で連想配列の item   属性を指定する例 
<?php $items_list  = array( 23  => array( 'no'  =>  2456 ,  'label'  =>  'Salad' ),                      96  => array( 'no'  =>  4889 ,  'label'  =>  'Cream' )                     ); $smarty -> assign ( 'items' ,  $items_list ); ?> 
 
$items   と
   $myId   を url に出力するテンプレート
<ul>
{foreach from=$items key=myId item=i}
  <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
{/foreach}
</ul> 
   出力
  
<ul>
  <li><a href="item.php?id=23">2456: Salad</li>
  <li><a href="item.php?id=96">4889: Cream</li>
</ul> 
例 7-8. {foreach} で item   と key   をネストする例 
配列を Smarty に割り当てます。key にはループする値のキーが含まれます。
<?php  $smarty -> assign ( 'contacts' , array(                              array( 'phone'  =>  '1' ,                                     'fax'  =>  '2' ,                                     'cell'  =>  '3' ),                              array( 'phone'  =>  '555-4444' ,                                     'fax'  =>  '555-3333' ,                                     'cell'  =>  '760-1234' )                              )); ?> 
 
$contact   を出力するテンプレート
{foreach name=outer item=contact from=$contacts}
  <hr />
  {foreach key=key item=item from=$contact}
    {$key}: {$item}<br />
  {/foreach}
{/foreach} 
   出力
  
<hr />
  phone: 1<br />
  fax: 2<br />
  cell: 3<br />
<hr />
  phone: 555-4444<br />
  fax: 555-3333<br />
  cell: 760-1234<br /> 
例 7-9. データベースを使用する {foreachelse} の例 
データベース (PEAR や ADODB など) を検索する例で、クエリの結果を Smarty に割り当てます。
<?php   $search_condition  =  "where name like '$foo%' " ;    $sql  =  'select contact_id, name, nick from contacts ' . $search_condition . ' order by name' ;    $smarty -> assign ( 'results' ,  $db -> getAssoc ( $sql ) ); ?> 
 
結果がない場合に、{foreachelse} 
  を使用して "見つかりません"  と表示するテンプレート
{foreach key=cid item=con from=$results}
    <a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
{foreachelse}
    検索結果が見つかりませんでした
{/foreach} 
 .index
   index   には、現在の配列のインデックスをゼロから数えた値が含まれます。
  
例 7-10. index   の例 
{* ヘッダブロックを5行おきに出力します *} <table> {foreach from=$items key=myId item=i name=foo}   {if $smarty.foreach.foo.index % 5 == 0}      <tr><th>タイトル</th></tr>   {/if}   <tr><td>{$i.label}</td></tr> {/foreach} </table> 
 .iteration
   iteration   は現在のループが反復された回数を表示します。
   index  
   とは異なり、常に 1 から始まります。
   各ループごとに 1 ずつ加算されます。
  
例 7-11. iteration   および index   の例 
{* この出力は 0|1, 1|2, 2|3, ... のようになります *} {foreach from=$myArray item=i name=foo} {$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration}, {/foreach} 
 .first
   first   は、現在の {foreach} 
   の反復が最初のものであるときに TRUE  となります。
  
例 7-12. first   プロパティの例 
{* 最初の項目には「最新」、それ以外は id を表示します *} <table> {foreach from=$items key=myId item=i name=foo} <tr>   <td>{if $smarty.foreach.foo.first}最新{else}{$myId}{/if}</td>   <td>{$i.label}</td> </tr> {/foreach} </table> 
 .last
   last   は、現在の {foreach} 
   の反復が最後のものであるときに TRUE  となります。
  
例 7-13. last   プロパティの例 
{* 一覧の最後に横罫線を追加します *} {foreach from=$items key=part_id item=prod name=products}   <a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr>{else},{/if} {foreachelse}   ... コンテンツ ... {/foreach} 
 .show
   show   は {foreach}  のパラメータとして使用します。
   show   は boolean 値です。
   FALSE  の場合は {foreach}  は表示されず、
   もし {foreachelse}  が存在すれば、それが代わりに表示されます。
  
 .total
   total   には、
   {foreach}  がループするトータル回数が含まれます。
   これは、{foreach}  の内部だけではなく
   ループを抜けた後でも使用できます。
  
例 7-14. total   プロパティの例 
{* 返された行の総数を最後に表示します *} {foreach from=$items key=part_id item=prod name=foo} {$prod.name><hr/> {if $smarty.foreach.foo.last}   <div id="total">{$smarty.foreach.foo.total} items</div> {/if} {foreachelse}  ... 別の内容 ... {/foreach} 
   {section}  
   および  $smarty.foreach  
   も参照してください。