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