PageRenderTime 13ms CodeModel.GetById 2ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/documentation/ja/designers/language-builtin-functions/language-function-foreach.xml

https://bitbucket.org/hallgrennetworks/smarty
XML | 498 lines | 437 code | 38 blank | 23 comment | 0 complexity | ae7fb44ad74c0a340663a06ebf68c898 MD5 | raw file
  1<?xml version="1.0" encoding="utf-8"?>
  2<!-- $Revision$ -->
  3<!-- EN-Revision: 3829 Maintainer: takagi Status: ready -->
  4<!-- CREDITS: mat-sh,daichi,joe -->
  5<sect1 id="language.function.foreach">
  6 <title>{foreach},{foreachelse}</title> 
  7 <para>
  8  <varname>{foreach}</varname> はデータの配列をループするために使います。<varname>{foreach}</varname>
  9<link linkend="language.function.section"><varname>{section}</varname></link> ループよりもシンプルできれいな構文で、
 10  連想配列をループすることもできます。
 11 </para>
 12 <para>
 13  <varname>{foreach $arrayvar as $itemvar}</varname> 
 14 </para>
 15 <para>
 16  <varname>{foreach $arrayvar as $keyvar=>$itemvar}</varname> 
 17 </para>
 18 <note>
 19 <para>
 20  この foreach 構文は、名前つき属性を受け付けません。この構文は Smarty 3
 21  で新しく導入されたものですが、Smarty 2.x 形式の
 22  <literal>{foreach from=$myarray key="mykey" item="myitem"}</literal> もまだ対応しています。
 23 </para>
 24 </note>
 25   <itemizedlist>
 26   <listitem><para>
 27   <varname>{foreach}</varname> ループはネストさせることができます。
 28   </para></listitem>
 29
 30   <listitem><para>
 31   <parameter>array</parameter> 変数を渡すと、その要素数で
 32   <varname>{foreach}</varname> のループ回数が決まります。
 33   整数値を渡してループ回数を決めることもできます。
 34   </para></listitem>
 35
 36   <listitem><para>
 37   <parameter>array</parameter> 変数に値がない場合に、
 38   <varname>{foreachelse}</varname> が実行されます。
 39   </para></listitem>
 40    
 41  <listitem><para>
 42    <varname>{foreach}</varname> のプロパティには
 43    <link linkend="foreach.property.index"><parameter>@index</parameter></link> 44    <link linkend="foreach.property.iteration"><parameter>@iteration</parameter></link> 45    <link linkend="foreach.property.first"><parameter>@first</parameter></link> 46    <link linkend="foreach.property.last"><parameter>@last</parameter></link> 47    <link linkend="foreach.property.show"><parameter>@show</parameter></link> 48    <link linkend="foreach.property.total"><parameter>@total</parameter></link>
 49    があります。
 50  </para>
 51    
 52  </listitem>
 53        
 54    <listitem><para>
 55     <parameter>key</parameter> 変数のかわりに、ループ要素の現在のキーにアクセスする方法として
 56     <parameter>{$item@key}</parameter> を使うことができます (以下の例を参照ください)。
 57    </para></listitem>    
 58    
 59   </itemizedlist> 
 60 
 61   <note>
 62   <para>
 63    <literal>$var@property</literal> 構文は Smarty 3 で新しく導入されたものですが、
 64    Smarty 2 の <literal>{foreach from=$myarray key="mykey" item="myitem"}</literal> 英式の構文での
 65    <literal>$smarty.foreach.name.property</literal> もまだ対応しています。
 66   </para>
 67   </note>  
 68   <note>
 69   <para>
 70    配列のキーを <literal>{foreach $myArray as $myKey => $myValue}</literal>
 71    で取得することもできますが、foreach ループ内で常に <varname>$myValue@key</varname>
 72    で取得することができます。
 73   </para>
 74   </note>
 75 
 76 
 77 <para><emphasis role="bold">オプションのフラグ</emphasis></para>
 78 <informaltable frame="all">
 79  <tgroup cols="2">
 80   <colspec colname="param" align="center" />
 81   <colspec colname="desc" />
 82   <thead>
 83    <row>
 84     <entry>名前</entry>
 85     <entry>概要</entry>
 86    </row>
 87   </thead>
 88   <tbody>
 89    <row>
 90     <entry>nocache</entry>
 91     <entry><varname>{foreach}</varname> ループのキャッシュを無効にする</entry>
 92    </row>
 93   </tbody>
 94  </tgroup>
 95 </informaltable>
 96 
 97 
 98 <example>
 99  <title>シンプルな <varname>{foreach}</varname> ループ</title>
100  <programlisting role="php">
101<![CDATA[
102<?php
103$arr = array('red', 'green', 'blue');
104$smarty->assign('myColors', $arr);
105?>
106]]>
107  </programlisting>
108   <para><parameter>$myArray</parameter> を順序なしリストで出力するテンプレート</para>
109  <programlisting>
110<![CDATA[
111<ul>
112{foreach $myColors as $color}
113    <li>{$color}</li>
114{/foreach}
115</ul>
116]]>
117  </programlisting>
118  <para>
119   上の例の出力は次のようになります。
120  </para>
121  <screen>
122<![CDATA[
123<ul>
124    <li>red</li>
125    <li>green</li>
126    <li>blue</li>
127</ul>
128]]>
129  </screen>
130 </example>
131
132<example>
133  <title>追加の <parameter>key</parameter> 変数の例</title>
134  <programlisting role="php">
135<![CDATA[
136<?php
137$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
138$smarty->assign('myPeople', $people);
139?>
140]]>
141  </programlisting>
142   <para><parameter>$myArray</parameter> を キー/値 のペアで出力するテンプレート。</para>
143  <programlisting>
144<![CDATA[
145<ul>
146{foreach $myPeople as $value}
147   <li>{$value@key}: {$value}</li>
148{/foreach}
149</ul>
150]]>
151  </programlisting>
152  <para>
153   上の例の出力は次のようになります。
154  </para>
155  <screen>
156<![CDATA[
157<ul>
158    <li>fname: John</li>
159    <li>lname: Doe</li>
160    <li>email: j.doe@example.com</li>
161</ul>
162]]>
163  </screen>
164 </example>
165
166
167
168 <example>
169  <title>{foreach} で <parameter>item</parameter><parameter>key</parameter> をネストする例</title>
170  <para>配列を Smarty に割り当てます。key にはループする値のキーが含まれます。</para>
171  <programlisting role="php">
172<![CDATA[
173<?php
174 $smarty->assign('contacts', array(
175                             array('phone' => '555-555-1234',
176                                   'fax' => '555-555-5678',
177                                   'cell' => '555-555-0357'),
178                             array('phone' => '800-555-4444',
179                                   'fax' => '800-555-3333',
180                                   'cell' => '800-555-2222')
181                             ));
182?>
183]]>
184  </programlisting>
185  <para><parameter>$contact</parameter> を出力するテンプレート</para>
186  <programlisting>
187<![CDATA[
188{* key は常にプロパティとして使えます *}
189{foreach $contacts as $contact}
190  {foreach $contact as $value}
191    {$value@key}: {$value}
192  {/foreach}
193{/foreach}
194
195{* PHP の構文を使ってキーにアクセスすることもできます *}
196{foreach $contacts as $contact}
197  {foreach $contact as $key => $value}
198    {$key}: {$value}
199  {/foreach}
200{/foreach}
201]]>
202  </programlisting>
203  <para>
204   上の例の出力は、どちらも次のようになります。
205  </para>
206  <screen>
207<![CDATA[
208  phone: 555-555-1234
209  fax: 555-555-5678
210  cell: 555-555-0357
211  phone: 800-555-4444
212  fax: 800-555-3333
213  cell: 800-555-2222
214]]>
215  </screen>
216 </example>
217
218 <example>
219  <title>データベースでの {foreachelse} の例</title>
220  <para>データベース (PDO) の検索結果をループします。この例は、array() ではなく PHP のイテレータをループします。</para>
221<programlisting role="php">
222<![CDATA[
223<?php 
224  include('Smarty.class.php'); 
225
226  $smarty = new Smarty; 
227
228  $dsn = 'mysql:host=localhost;dbname=test'; 
229  $login = 'test'; 
230  $passwd = 'test'; 
231
232  // テンプレート内で複数の結果カーソルを使う場合は、
233  // mysql のバッファクエリを使うように PDO を
234  // 設定します
235
236  $db = new PDO($dsn, $login, $passwd, array( 
237     PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); 
238
239  $res = $db->prepare("select * from users"); 
240  $res->execute(); 
241  $res->setFetchMode(PDO::FETCH_LAZY); 
242
243  // Smarty に代入します
244  $smarty->assign('res',$res); 
245
246  $smarty->display('index.tpl');?>
247?>
248]]>
249  </programlisting>
250  <programlisting>
251<![CDATA[
252{foreach $res as $r} 
253  {$r.id} 
254  {$r.name}
255{foreachelse}
256  .. 検索結果が見つかりませんでした ..
257{/foreach}
258]]>
259  </programlisting>
260 </example>
261
262 <para>
263   上の例では、結果に <literal>id</literal> および <literal>name</literal>
264   というカラムが含まれることを前提としています。
265 </para>
266 <para>
267   普通に配列をループさせるのに比べたイテレータの利点は何でしょうか?
268   配列の場合は、すべての結果をメモリに取り込んでからループが始まります。
269   イテレータの場合は、ループ内で 1 件ずつ読み込みと解放を繰り返します。
270   これは、結果セットが巨大な場合は特に、処理時間とメモリの節約になるでしょう。
271 </para>
272
273 <sect2 id="foreach.property.index">
274  <title>@index</title>
275  <para>
276   <parameter>index</parameter> には、現在の配列のインデックスをゼロから数えた値が含まれます。
277  </para>
278  <example>
279  <title><parameter>index</parameter> の例</title>
280
281   <programlisting>
282<![CDATA[
283{* 4 回目の反復 (index が 3 のとき) に空の行を出力します *}
284<table>
285{foreach $items as $i}
286  {if $i@index eq 3}
287     {* 空の行を出力します *}
288     <tr><td>nbsp;</td></tr>
289  {/if}
290  <tr><td>{$i.label}</td></tr>
291{/foreach}
292</table>
293]]>
294  </programlisting>
295  </example>
296  </sect2>
297
298 <sect2 id="foreach.property.iteration">
299  <title>@iteration</title>
300  <para>
301   <parameter>iteration</parameter> は現在のループが反復された回数を表示します。
302   <link linkend="foreach.property.index"><parameter>index</parameter></link>
303   とは異なり、常に 1 から始まります。
304   各ループごとに 1 ずつ加算されます。
305  </para>
306 <example>
307  <title><parameter>iteration</parameter> の例: is div by</title>
308  <para>
309    <emphasis>"is div by"</emphasis> 演算子を使うと、特定の回数を検出することができます。
310    これは、4 件おきに名前を太字にする例です。
311  </para>
312  <programlisting>
313<![CDATA[
314{foreach $myNames as $name}
315  {if $name@iteration is div by 4}
316    <b>{$name}</b>
317  {/if}
318  {$name}
319{/foreach}
320]]>
321</programlisting> 
322 </example>
323  <example>
324   <title><parameter>iteration</parameter> の例: is even/odd by</title>
325   <para>
326     <emphasis>"is even by"</emphasis> 演算子と <emphasis>"is odd by"</emphasis> 演算子を使うと、
327     特定の件数ごとに何かを切り替えることができます。
328     even と odd で、どちらから始まるかが切り替わります。
329     これは、3 件おきにフォントの色を切り替える例です。
330   </para>
331   <programlisting>
332 <![CDATA[
333 {foreach $myNames as $name}
334   {if $name@iteration is even by 3}
335     <span style="color: #000">{$name}</span>
336   {else}
337     <span style="color: #eee">{$name}</span>
338   {/if}
339 {/foreach}
340 ]]>
341 </programlisting> 
342 
343   <para>
344    この出力は、次のようになります。
345   </para>
346   <screen>
347<![CDATA[
348    <span style="color: #000">...</span>
349    <span style="color: #000">...</span>
350    <span style="color: #000">...</span>
351    <span style="color: #eee">...</span>
352    <span style="color: #eee">...</span>
353    <span style="color: #eee">...</span>
354    <span style="color: #000">...</span>
355    <span style="color: #000">...</span>
356    <span style="color: #000">...</span>
357    <span style="color: #eee">...</span>
358    <span style="color: #eee">...</span>
359    <span style="color: #eee">...</span>
360    ...
361]]>
362   </screen>
363 
364  </example>
365 </sect2>
366
367 <sect2 id="foreach.property.first">
368  <title>@first</title>
369  <para>
370   <parameter>first</parameter> は、現在の <varname>{foreach}</varname>
371   の反復が最初のものであるときに &true; となります。
372   ここでは、最初の反復時にテーブルのヘッダを表示します。
373  </para>
374  <example>
375  <title><parameter>first</parameter> プロパティの例</title>
376   <programlisting>
377<![CDATA[
378{* 最初の項目にはテーブルのヘッダを表示します *}
379<table>
380{foreach $items as $i}
381  {if $i@first}
382    <tr>
383      <th>key</td>
384      <th>name</td>
385    </tr>
386  {/if}
387  <tr>
388    <td>{$i@key}</td>
389    <td>{$i.name}</td>
390  </tr>
391{/foreach}
392</table>
393]]>
394  </programlisting>
395  </example>
396 </sect2>
397
398 <sect2 id="foreach.property.last">
399  <title>@last</title>
400  <para>
401   <parameter>last</parameter> は、現在の <varname>{foreach}</varname>
402   の反復が最後のものであるときに &true; となります。
403   この例では、最後の反復に横罫線を表示します。
404  </para>
405   <example>
406  <title><parameter>last</parameter> プロパティの例</title>
407    <programlisting>
408<![CDATA[
409{* 一覧の最後に横罫線を追加します *}
410{foreach $items as $item}
411  <a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if}
412{foreachelse}
413  ... コンテンツ ...
414{/foreach}
415]]>
416  </programlisting>
417   </example>
418 </sect2>
419
420 <sect2 id="foreach.property.show">
421  <title>@show</title>
422  <para>
423   <parameter>show</parameter><varname>{foreach}</varname> のパラメータとして使用します。
424   <parameter>show</parameter> は boolean 値です。
425   &false; の場合は <varname>{foreach}</varname> は表示されません。
426  </para>
427  <example>
428   <title><parameter>show</parameter> プロパティの例</title>
429   <programlisting>
430<![CDATA[
431<ul>
432{foreach $myArray as $name}
433    <li>{$name}</li>
434{/foreach}
435</ul>
436{if $name@show} 配列にデータが含まれている場合にここで何かをします {/if}
437]]>
438</programlisting>
439</example>
440 </sect2>
441
442 <sect2 id="foreach.property.total">
443  <title>@total</title>
444  <para>
445   <parameter>total</parameter> には、
446   <varname>{foreach}</varname> がループするトータル回数が含まれます。
447   これは、<varname>{foreach}</varname> の内部だけではなく
448   ループを抜けた後でも使用できます。
449  </para>
450     <example>
451  <title><parameter>total</parameter> プロパティの例</title>
452<programlisting>
453<![CDATA[
454{* 返された行の総数を最後に表示します *}
455{foreach $items as $item}
456  {$item.name}<hr/>
457  {if $item@last}
458    <div id="total">{$item@total} items</div>
459  {/if}
460{foreachelse}
461 ... 別の内容 ...
462{/foreach}
463]]>
464</programlisting>
465</example>
466
467  <para>
468   <link linkend="language.function.section"><varname>{section}</varname></link>469   <link linkend="language.function.for"><varname>{for}</varname></link>
470   および
471   <link linkend="language.function.while"><varname>{while}</varname></link>
472   も参照ください。
473  </para>
474
475 </sect2>
476 
477</sect1>
478
479<!-- Keep this comment at the end of the file
480 Local variables:
481 mode: sgml
482 sgml-omittag:t
483 sgml-shorttag:t
484 sgml-minimize-attributes:nil
485 sgml-always-quote-attributes:t
486 sgml-indent-step:1
487 sgml-indent-data:t
488 indent-tabs-mode:nil
489 sgml-parent-document:nil
490 sgml-default-dtd-file:"../../../../manual.ced"
491 sgml-exposed-tags:nil
492 sgml-local-catalogs:nil
493 sgml-local-ecat-files:nil
494 End:
495 vim600: syn=xml fen fdm=syntax fdl=2 si
496 vim: et tw=78 syn=sgml
497 vi: ts=1 sw=1
498-->