{foreach} はデータの配列をループするために使います。{foreach}
は {section} ループよりもシンプルできれいな構文で、
連想配列をループすることもできます。
{foreach $arrayvar as $itemvar}
{foreach $arrayvar as $keyvar=>$itemvar}
この foreach 構文は、名前つき属性を受け付けません。この構文は Smarty 3
で新しく導入されたものですが、Smarty 2.x 形式の
{foreach from=$myarray key="mykey" item="myitem"} もまだ対応しています。
$var@property 構文は Smarty 3 で新しく導入されたものですが、
Smarty 2 の {foreach from=$myarray key="mykey" item="myitem"} 英式の構文での
$smarty.foreach.name.property もまだ対応しています。
配列のキーを {foreach $myArray as $myKey => $myValue}
で取得することもできますが、foreach ループ内で常に $myValue@key
で取得することができます。
オプションのフラグ
| 名前 | 概要 |
|---|---|
| nocache |
{foreach} ループのキャッシュを無効にする |
Example 7.30. シンプルな {foreach} ループ
<?php
$arr = array('red', 'green', 'blue');
$smarty->assign('myColors', $arr);
?>
$myArray を順序なしリストで出力するテンプレート
<ul>
{foreach $myColors as $color}
<li>{$color}</li>
{/foreach}
</ul>
上の例の出力は次のようになります。
<ul>
<li>red</li>
<li>green</li>
<li>blue</li>
</ul>
Example 7.31. 追加の key 変数の例
<?php
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
$smarty->assign('myPeople', $people);
?>
$myArray を キー/値 のペアで出力するテンプレート。
<ul>
{foreach $myPeople as $value}
<li>{$value@key}: {$value}</li>
{/foreach}
</ul>
上の例の出力は次のようになります。
<ul>
<li>fname: John</li>
<li>lname: Doe</li>
<li>email: j.doe@example.com</li>
</ul>
Example 7.32. {foreach} で item と key をネストする例
配列を Smarty に割り当てます。key にはループする値のキーが含まれます。
<?php
$smarty->assign('contacts', array(
array('phone' => '555-555-1234',
'fax' => '555-555-5678',
'cell' => '555-555-0357'),
array('phone' => '800-555-4444',
'fax' => '800-555-3333',
'cell' => '800-555-2222')
));
?>
$contact を出力するテンプレート
{* key は常にプロパティとして使えます *}
{foreach $contacts as $contact}
{foreach $contact as $value}
{$value@key}: {$value}
{/foreach}
{/foreach}
{* PHP の構文を使ってキーにアクセスすることもできます *}
{foreach $contacts as $contact}
{foreach $contact as $key => $value}
{$key}: {$value}
{/foreach}
{/foreach}
上の例の出力は、どちらも次のようになります。
phone: 555-555-1234 fax: 555-555-5678 cell: 555-555-0357 phone: 800-555-4444 fax: 800-555-3333 cell: 800-555-2222
Example 7.33. データベースでの {foreachelse} の例
データベース (PDO) の検索結果をループします。この例は、array() ではなく PHP のイテレータをループします。
<?php
include('Smarty.class.php');
$smarty = new Smarty;
$dsn = 'mysql:host=localhost;dbname=test';
$login = 'test';
$passwd = 'test';
// テンプレート内で複数の結果カーソルを使う場合は、
// mysql のバッファクエリを使うように PDO を
// 設定します
$db = new PDO($dsn, $login, $passwd, array(
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
$res = $db->prepare("select * from users");
$res->execute();
$res->setFetchMode(PDO::FETCH_LAZY);
// Smarty に代入します
$smarty->assign('res',$res);
$smarty->display('index.tpl');?>
?>
{foreach $res as $r}
{$r.id}
{$r.name}
{foreachelse}
.. 検索結果が見つかりませんでした ..
{/foreach}
上の例では、結果に id および name
というカラムが含まれることを前提としています。
普通に配列をループさせるのに比べたイテレータの利点は何でしょうか? 配列の場合は、すべての結果をメモリに取り込んでからループが始まります。 イテレータの場合は、ループ内で 1 件ずつ読み込みと解放を繰り返します。 これは、結果セットが巨大な場合は特に、処理時間とメモリの節約になるでしょう。
index には、現在の配列のインデックスをゼロから数えた値が含まれます。
iteration は現在のループが反復された回数を表示します。
index
とは異なり、常に 1 から始まります。
各ループごとに 1 ずつ加算されます。
Example 7.35. iteration の例: is div by
"is div by" 演算子を使うと、特定の回数を検出することができます。 これは、4 件おきに名前を太字にする例です。
{foreach $myNames as $name}
{if $name@iteration is div by 4}
<b>{$name}</b>
{/if}
{$name}
{/foreach}
Example 7.36. iteration の例: is even/odd by
"is even by" 演算子と "is odd by" 演算子を使うと、 特定の件数ごとに何かを切り替えることができます。 even と odd で、どちらから始まるかが切り替わります。 これは、3 件おきにフォントの色を切り替える例です。
{foreach $myNames as $name}
{if $name@iteration is even by 3}
<span style="color: #000">{$name}</span>
{else}
<span style="color: #eee">{$name}</span>
{/if}
{/foreach}
この出力は、次のようになります。
<span style="color: #000">...</span>
<span style="color: #000">...</span>
<span style="color: #000">...</span>
<span style="color: #eee">...</span>
<span style="color: #eee">...</span>
<span style="color: #eee">...</span>
<span style="color: #000">...</span>
<span style="color: #000">...</span>
<span style="color: #000">...</span>
<span style="color: #eee">...</span>
<span style="color: #eee">...</span>
<span style="color: #eee">...</span>
...
first は、現在の {foreach}
の反復が最初のものであるときに TRUE となります。
ここでは、最初の反復時にテーブルのヘッダを表示します。
last は、現在の {foreach}
の反復が最後のものであるときに TRUE となります。
この例では、最後の反復に横罫線を表示します。
show は {foreach} のパラメータとして使用します。
show は boolean 値です。
FALSE の場合は {foreach} は表示されません。