Location: PHPKode > projects > Runemaster > docs/template.foreach.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>3.2. 繰り返し処理 (foreach)</title>
<link rel="stylesheet" href="style.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2">
<link rel="start" href="index.html" title="Runemaster マニュアル">
<link rel="up" href="variable.html" title="第3章 テンプレート変数">
<link rel="prev" href="variable.html" title="第3章 テンプレート変数">
<link rel="next" href="template.variable.evaluation.html" title="3.3. 条件判定 (if)">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">3.2. 繰り返し処理 (foreach)</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="variable.html">前のページ</a> </td>
<th width="60%" align="center">第3章 テンプレート変数</th>
<td width="20%" align="right"> <a accesskey="n" href="template.variable.evaluation.html">次のページ</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="section" lang="ja">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="template.foreach"></a>3.2. 繰り返し処理 (foreach)</h2></div></div></div>
<div class="section" lang="ja">
<div class="titlepage"><div><div><h3 class="title">
<a name="variable.foreach"></a>3.2.1. 変数値による繰り返し処理</h3></div></div></div>
<p>
      プログラムによって与えられたテンプレート変数の値が配列もしくはオブジェクトである場合、
      その値の要素数分、テンプレート上において繰り返し処理を行うことができます。
    </p>
<p>
      テンプレート上の繰り返し処理は、PHP の foreach 〜 as 構文のような記述を行います。
      HTML タグに対して、「foreach」属性の値にベースとなる配列もしくはオブジェクトのテンプレート変数の名称をセットし、
      あわせて「as」属性の値に foreach 属性でセットした変数を展開したものを格納する新たな変数名をセットします。
    </p>
<div class="example">
<a name="id343184"></a><p class="title"><b>例 3.10. foreach〜as 属性による繰り返し処理</b></p>
<div class="example-contents"><div class="variablelist"><dl>
<dt><span class="term">テンプレート</span></dt>
<dd><pre class="programlisting">
&lt;div foreach="item_list" as="item"&gt;
  わたしは &lt;span key="item"&gt;アイテム&lt;/span&gt; を持っています.
&lt;/div&gt;</pre></dd>
<dt><span class="term">PHPコード</span></dt>
<dd><pre class="programlisting">
$master = new Rune_Master('/path/to/templateDirectory');

$variable = new stdClass();
$variable-&gt;item_list = array('staff', 'book', 'stone');
$master-&gt;assign($variable);
$master-&gt;cast('function');</pre></dd>
<dt><span class="term">実行結果</span></dt>
<dd><pre class="programlisting">
&lt;div &gt;
  わたしは &lt;span key="item"&gt;staff&lt;/span&gt; を持っています.
&lt;/div&gt;&lt;div &gt;
  わたしは &lt;span key="item"&gt;book&lt;/span&gt; を持っています.
&lt;/div&gt;&lt;div &gt;
  わたしは &lt;span key="item"&gt;stone&lt;/span&gt; を持っています.
&lt;/div&gt;</pre></dd>
</dl></div></div>
</div>
<br class="example-break"><p>
      ここでは、as 属性の値としてセットされている item が
      PHP プログラム内で登場していない点に注目してください。
      foreach 属性の値でセットされている item_list 配列が展開すると同時に、
      配列内の1つの要素が item テンプレート変数に格納されます。
      作成された item 変数は通常のテンプレート変数のように利用できますので、
      key 属性の値として利用して置換処理を行っています。
    </p>
<p>
      繰り返しの対象となるのは、foreach〜as 属性が設定されているブロック以下、
      すなわち今回の例ですと &lt;div&gt; 〜 &lt;/div&gt; までとなり、
      それらが item_list 配列の要素数回繰り返されます。
      また、as 属性によって割り当てられるテンプレート変数も、そのブロック内でのみ利用できます。
    </p>
<p>
      as 属性によるテンプレート変数は、
      前節で紹介したテンプレート変数の利用法と何ら違いはありません。
      たとえばリストを展開した結果が連想配列、もしくはオブジェクトであったとしても、
      次のようにそのままアクセスできます。
    </p>
<pre class="programlisting">
&lt;table&gt;
  &lt;tr foreach="person_list" as="person"&gt;
    &lt;td key="person.id"&gt;ID&lt;/td&gt;
    &lt;td key="person.name"&gt;名前&lt;/td&gt;
    &lt;td key="person.email"&gt;メールアドレス&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;</pre>
<p>
      これら例では、foreach〜as 属性のタグ内部である要素のタグに
      key 属性を設定していますが、次のように同一タグでも動作します。
    </p>
<pre class="programlisting">
&lt;p foreach="message_list" as="message" key="message"&gt;メッセージの繰り返し&lt;/p&gt;</pre>
<p>
      また、連想配列やオブジェクトに対して繰り返し処理を行う際、
      その要素名やプロパティ名もテンプレート変数値で参照したいと思うかもしれません。
      その場合には、as 属性の値にカンマ(,)で区切った形式で2つのテンプレート変数をセットします。
    </p>
<pre class="programlisting">
&lt;div foreach="item_list" as="key, value"&gt;
  私は &lt;span key="key"&gt;要素&lt;/span&gt; の &lt;span key="value"&gt;値&lt;/span&gt; を持っています.
&lt;/div&gt;</pre>
</div>
<div class="section" lang="ja">
<div class="titlepage"><div><div><h3 class="title">
<a name="nest.foreach"></a>3.2.2. 繰り返し処理のネスト</h3></div></div></div>
<p>
      foreach〜as 属性による処理はネスト(入れ子、多階層)することもできます。
    </p>
<div class="example">
<a name="id343320"></a><p class="title"><b>例 3.11. 繰り返し処理のネスト</b></p>
<div class="example-contents"><pre class="programlisting">
&lt;div foreach="person_list" as="person"&gt;
  &lt;div foreach="person" as="key, value"&gt;
    &lt;span key="key"&gt;要素名&lt;/span&gt;: &lt;b key="value"&gt;値&lt;/b&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre></div>
</div>
<br class="example-break">
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="variable.html">前のページ</a> </td>
<td width="20%" align="center"><a accesskey="u" href="variable.html">上に戻る</a></td>
<td width="40%" align="right"> <a accesskey="n" href="template.variable.evaluation.html">次のページ</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">第3章 テンプレート変数 </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">ホーム</a></td>
<td width="40%" align="right" valign="top"> 3.3. 条件判定 (if)</td>
</tr>
</table>
</div>
</body>
</html>
Return current item: Runemaster