Просмотр файла manual-ru/language.function.foreach.html

Размер файла: 20.46Kb
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4. <title>{foreach},{foreachelse}</title>
  5. <meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
  6. <link rel="home" href="index.html" title="Руководство по Smarty">
  7. <link rel="up" href="language.builtin.functions.html" title="Chapter 7. Встроенные функции">
  8. <link rel="prev" href="language.function.config.load.html" title="{config_load}">
  9. <link rel="next" href="language.function.if.html" title="{if},{elseif},{else}">
  10. </head>
  11. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  12. <div class="navheader">
  13. <table width="100%" summary="Navigation header">
  14. <tr><th colspan="3" align="center">{foreach},{foreachelse}</th></tr>
  15. <tr>
  16. <td width="20%" align="left">
  17. <a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
  18. <th width="60%" align="center">Chapter 7. Встроенные функции</th>
  19. <td width="20%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
  20. </td>
  21. </tr>
  22. </table>
  23. <hr>
  24. </div>
  25. <div class="sect1" title="{foreach},{foreachelse}">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="language.function.foreach"></a>{foreach},{foreachelse}</h2></div></div></div>
  28. <p>
  29. <code class="varname">{foreach}</code> используется для работы как с
  30. <span class="bold"><strong>ассоциативным</strong></span>,
  31. так и с числовыми массивами, в отличие от функции
  32. <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>,
  33. которая предназначена для работы
  34. <span class="bold"><strong>исключительно с числовыми массивами</strong></span>.
  35. Синтаксис функции <code class="varname">{foreach}</code> намного проще, чем
  36. <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>,
  37. но она может работать <span class="bold"><strong>только с одним массивом</strong></span>
  38. одновременно. Каждый тэг <code class="varname">{foreach}</code> должен иметь
  39. закрывающую пару <code class="varname">{/foreach}</code>.
  40. </p>
  41. <div class="informaltable"><table border="1">
  42. <colgroup>
  43. <col align="center">
  44. <col align="center">
  45. <col align="center">
  46. <col align="center">
  47. <col>
  48. </colgroup>
  49. <thead><tr>
  50. <th align="center">Имя атрибута</th>
  51. <th align="center">Тип</th>
  52. <th align="center">Обязателен</th>
  53. <th align="center">По умолчанию</th>
  54. <th>Описание</th>
  55. </tr></thead>
  56. <tbody>
  57. <tr>
  58. <td align="center">from</td>
  59. <td align="center">array</td>
  60. <td align="center">Да</td>
  61. <td align="center"><span class="emphasis"><em>n/a</em></span></td>
  62. <td>Массив, по которому надо пройтись</td>
  63. </tr>
  64. <tr>
  65. <td align="center">item</td>
  66. <td align="center">string</td>
  67. <td align="center">Да</td>
  68. <td align="center"><span class="emphasis"><em>n/a</em></span></td>
  69. <td>Имя переменной, которая будет значением текущего елемента</td>
  70. </tr>
  71. <tr>
  72. <td align="center">key</td>
  73. <td align="center">string</td>
  74. <td align="center">Нет</td>
  75. <td align="center"><span class="emphasis"><em>n/a</em></span></td>
  76. <td>Имя переменной, которая будет ключом текущего елемента</td>
  77. </tr>
  78. <tr>
  79. <td align="center">name</td>
  80. <td align="center">string</td>
  81. <td align="center">Нет</td>
  82. <td align="center"><span class="emphasis"><em>n/a</em></span></td>
  83. <td>Название цикла foreach для доступа к его свойствам</td>
  84. </tr>
  85. </tbody>
  86. </table></div>
  87. <div class="itemizedlist"><ul class="itemizedlist" type="disc">
  88. <li class="listitem"><p>
  89. Атрибуты <em class="parameter"><code>from</code></em> и <em class="parameter"><code>item</code></em>
  90. являются обязательными.
  91. </p></li>
  92. <li class="listitem"><p>
  93. Параметр <em class="parameter"><code>name</code></em> цикла <code class="varname">{foreach}</code>
  94. может состоять из букв, цифр и знака подчеркивания, как и
  95. <a class="ulink" href="http://php.net/language.variables" target="_top">переменные PHP</a>.
  96. </p></li>
  97. <li class="listitem"><p>
  98. Циклы <code class="varname">{foreach}</code> могут быть вложенными при условии, что
  99. их имена будут уникальными.
  100. </p></li>
  101. <li class="listitem"><p>
  102. Атрибут <em class="parameter"><code>from</code></em>, обычно являющийся массивом,
  103. определяет количество проходов цикла <code class="varname">{foreach}</code>.
  104. </p></li>
  105. <li class="listitem"><p>
  106. Блок <code class="varname">{foreachelse}</code> выполняется в том случае, если
  107. в параметре <em class="parameter"><code>from</code></em> нет значений.
  108. </p></li>
  109. <li class="listitem">
  110. <p>
  111. У циклов <code class="varname">{foreach}</code> также есть собственные переменные,
  112. которые обрабатывают свойства.
  113. Доступ к ним можно получить таким образом:
  114. <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}, {$smarty.foreach}">
  115. <em class="parameter"><code>{$smarty.foreach.name.property}</code></em></a>, где
  116. <span class="quote"><span class="quote">name</span></span> - атрибут <em class="parameter"><code>name</code></em> функции
  117. <code class="varname">{foreach}</code>.
  118. </p>
  119. <div class="note" title="Обратите внимание" style="margin-left: 0.5in; margin-right: 0.5in;">
  120. <h3 class="title">Обратите внимание</h3>
  121. <p>
  122. Атрибут <em class="parameter"><code>name</code></em> необходим только в том случае,
  123. когда у вас есть необходимость обращаться к свойствам
  124. <code class="varname">{foreach}</code>, в отличие от функции
  125. <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>.
  126. Обращение к свойствам <code class="varname">{foreach}</code> с неопределенным
  127. <em class="parameter"><code>name</code></em> не вызывает ошибки, но ведёт к непредсказуемым
  128. результатам.
  129. </p>
  130. </div>
  131. </li>
  132. <li class="listitem"><p>
  133. <code class="varname">{foreach}</code> имеет следующие свойства:
  134. <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>,
  135. <a class="link" href="language.function.foreach.html#foreach.property.iteration" title=".iteration"><em class="parameter"><code>iteration</code></em></a>,
  136. <a class="link" href="language.function.foreach.html#foreach.property.first" title=".first"><em class="parameter"><code>first</code></em></a>,
  137. <a class="link" href="language.function.foreach.html#foreach.property.last" title=".last"><em class="parameter"><code>last</code></em></a>,
  138. <a class="link" href="language.function.foreach.html#foreach.property.show" title=".show"><em class="parameter"><code>show</code></em></a> и
  139. <a class="link" href="language.function.foreach.html#foreach.property.total" title=".total"><em class="parameter"><code>total</code></em></a>.
  140. </p></li>
  141. </ul></div>
  142. <div class="example">
  143. <a name="id2668883"></a><p class="title"><b>Example 7.5. Атрибут <em class="parameter"><code>item</code></em></b></p>
  144. <div class="example-contents">
  145. <pre class="programlisting">
  146.  
  147. &lt;?php
  148. $arr = array(1000, 1001, 1002);
  149. $smarty-&gt;assign('myArray', $arr);
  150. ?&gt;
  151.  
  152. </pre>
  153. <p>
  154. Шаблон для отображения <em class="parameter"><code>$myArray</code></em> в виде
  155. ненумерованного списка
  156. </p>
  157. <pre class="programlisting">
  158.  
  159. &lt;ul&gt;
  160. {foreach from=$myArray item=foo}
  161. &lt;li&gt;{$foo}&lt;/li&gt;
  162. {/foreach}
  163. &lt;/ul&gt;
  164.  
  165. </pre>
  166. <p>
  167. Результат выполнения данного примера:
  168. </p>
  169. <pre class="screen">
  170.  
  171. &lt;ul&gt;
  172. &lt;li&gt;1000&lt;/li&gt;
  173. &lt;li&gt;1001&lt;/li&gt;
  174. &lt;li&gt;1002&lt;/li&gt;
  175. &lt;/ul&gt;
  176.  
  177. </pre>
  178. </div>
  179. </div>
  180. <br class="example-break"><div class="example">
  181. <a name="id2668941"></a><p class="title"><b>Example 7.6. Пример работы атрибутов <em class="parameter"><code>item</code></em> и <em class="parameter"><code>key</code></em></b></p>
  182. <div class="example-contents">
  183. <pre class="programlisting">
  184.  
  185. &lt;?php
  186. $arr = array(9 =&gt; 'Tennis', 3 =&gt; 'Swimming', 8 =&gt; 'Coding');
  187. $smarty-&gt;assign('myArray', $arr);
  188. ?&gt;
  189.  
  190. </pre>
  191. <p>
  192. Шаблон для отображения <em class="parameter"><code>$myArray</code></em> в виде пар ключ/значение,
  193. как <a class="ulink" href="http://php.net/foreach" target="_top"><code class="varname">foreach</code></a>
  194. в PHP.</p>
  195. <pre class="programlisting">
  196.  
  197. &lt;ul&gt;
  198. {foreach from=$myArray key=k item=v}
  199. &lt;li&gt;{$k}: {$v}&lt;/li&gt;
  200. {/foreach}
  201. &lt;/ul&gt;
  202.  
  203. </pre>
  204. <p>
  205. Результат выполнения данного примера:
  206. </p>
  207. <pre class="screen">
  208.  
  209. &lt;ul&gt;
  210. &lt;li&gt;9: Tennis&lt;/li&gt;
  211. &lt;li&gt;3: Swimming&lt;/li&gt;
  212. &lt;li&gt;8: Coding&lt;/li&gt;
  213. &lt;/ul&gt;
  214.  
  215. </pre>
  216. </div>
  217. </div>
  218. <br class="example-break"><div class="example">
  219. <a name="id2669014"></a><p class="title"><b>Example 7.7. {foreach} с ассоциативным атрибутом <em class="parameter"><code>item</code></em></b></p>
  220. <div class="example-contents">
  221. <pre class="programlisting">
  222.  
  223. &lt;?php
  224. $items_list = array(23 =&gt; array('no' =&gt; 2456, 'label' =&gt; 'Salad'),
  225. 96 =&gt; array('no' =&gt; 4889, 'label' =&gt; 'Cream')
  226. );
  227. $smarty-&gt;assign('items', $items_list);
  228. ?&gt;
  229.  
  230. </pre>
  231. <p>
  232. Шаблон для отображения элементов <em class="parameter"><code>$items</code></em>, в котором
  233. <em class="parameter"><code>$myId</code></em> используется в URL'е
  234. </p>
  235. <pre class="programlisting">
  236.  
  237. &lt;ul&gt;
  238. {foreach from=$items key=myId item=i}
  239. &lt;li&gt;&lt;a href="item.php?id={$myId}"&gt;{$i.no}: {$i.label}&lt;/li&gt;
  240. {/foreach}
  241. &lt;/ul&gt;
  242.  
  243. </pre>
  244. <p>
  245. Результат выполнения данного примера:
  246. </p>
  247. <pre class="screen">
  248.  
  249. &lt;ul&gt;
  250. &lt;li&gt;&lt;a href="item.php?id=23"&gt;2456: Salad&lt;/li&gt;
  251. &lt;li&gt;&lt;a href="item.php?id=96"&gt;4889: Cream&lt;/li&gt;
  252. &lt;/ul&gt;
  253.  
  254. </pre>
  255. </div>
  256. </div>
  257. <br class="example-break"><div class="example">
  258. <a name="id2669082"></a><p class="title"><b>Example 7.8. {foreach} со вложенными <em class="parameter"><code>item</code></em> и <em class="parameter"><code>key</code></em></b></p>
  259. <div class="example-contents">
  260. <p>В Smarty передан такой массив, ключ которого содержит ключ для каждого перебираемого значения.</p>
  261. <pre class="programlisting">
  262.  
  263. &lt;?php
  264. $smarty-&gt;assign('contacts', array(
  265. array('phone' =&gt; '1',
  266. 'fax' =&gt; '2',
  267. 'cell' =&gt; '3'),
  268. array('phone' =&gt; '555-4444',
  269. 'fax' =&gt; '555-3333',
  270. 'cell' =&gt; '760-1234')
  271. ));
  272. ?&gt;
  273.  
  274. </pre>
  275. <p>Шаблон для отображения <em class="parameter"><code>$contact</code></em>.</p>
  276. <pre class="programlisting">
  277.  
  278. {foreach name=outer item=contact from=$contacts}
  279. &lt;hr /&gt;
  280. {foreach key=key item=item from=$contact}
  281. {$key}: {$item}&lt;br /&gt;
  282. {/foreach}
  283. {/foreach}
  284.  
  285. </pre>
  286. <p>
  287. Результат выполнения данного примера:
  288. </p>
  289. <pre class="screen">
  290.  
  291. &lt;hr /&gt;
  292. phone: 1&lt;br /&gt;
  293. fax: 2&lt;br /&gt;
  294. cell: 3&lt;br /&gt;
  295. &lt;hr /&gt;
  296. phone: 555-4444&lt;br /&gt;
  297. fax: 555-3333&lt;br /&gt;
  298. cell: 760-1234&lt;br /&gt;
  299.  
  300. </pre>
  301. </div>
  302. </div>
  303. <br class="example-break"><div class="example">
  304. <a name="id2669163"></a><p class="title"><b>Example 7.9. Пример использования {foreachelse} при работе с базой данных</b></p>
  305. <div class="example-contents">
  306. <p>
  307. Пример работы с базой данных (при помощи PEAR или ADODB) в скрипте поиска,
  308. результаты которого передаются в Smarty.
  309. </p>
  310. <pre class="programlisting">
  311.  
  312. &lt;?php
  313. $search_condition = "WHERE name LIKE '$foo%' ";
  314. $sql = 'SELECT contact_id, name, nick FROM contacts '.$search_condition.' ORDER BY name';
  315. $smarty-&gt;assign('results', $db-&gt;getAssoc($sql) );
  316. ?&gt;
  317.  
  318. </pre>
  319. <p>
  320. Шаблон отобразит сообщение <span class="quote"><span class="quote">Ничего не найдено</span></span> при помощи
  321. <code class="varname">{foreachelse}</code> в случае, если поиск не дал результатов.
  322. </p>
  323. <pre class="programlisting">
  324.  
  325. {foreach key=cid item=con from=$results}
  326. &lt;a href="contact.php?contact_id={$cid}"&gt;{$con.name} - {$con.nick}&lt;/a&gt;&lt;br /&gt;
  327. {foreachelse}
  328. Ничего не найдено
  329. {/foreach}
  330.  
  331. </pre>
  332. </div>
  333. </div>
  334. <br class="example-break"><div class="sect2" title=".index">
  335. <div class="titlepage"><div><div><h3 class="title">
  336. <a name="foreach.property.index"></a>.index</h3></div></div></div>
  337. <p>
  338. <em class="parameter"><code>index</code></em> contains the current array index, starting with zero.
  339. </p>
  340. <div class="example">
  341. <a name="id2669249"></a><p class="title"><b>Example 7.10. <em class="parameter"><code>index</code></em> example</b></p>
  342. <div class="example-contents"><pre class="programlisting">
  343.  
  344. {* The header block is output every five rows *}
  345. &lt;table&gt;
  346. {foreach from=$items key=myId item=i name=foo}
  347. {if $smarty.foreach.foo.index % 5 == 0}
  348. &lt;tr&gt;&lt;th&gt;Title&lt;/th&gt;&lt;/tr&gt;
  349. {/if}
  350. &lt;tr&gt;&lt;td&gt;{$i.label}&lt;/td&gt;&lt;/tr&gt;
  351. {/foreach}
  352. &lt;/table&gt;
  353.  
  354. </pre></div>
  355. </div>
  356. <br class="example-break">
  357. </div>
  358. <div class="sect2" title=".iteration">
  359. <div class="titlepage"><div><div><h3 class="title">
  360. <a name="foreach.property.iteration"></a>.iteration</h3></div></div></div>
  361. <p>
  362. <em class="parameter"><code>iteration</code></em> содержит значение текущей итерации цикла
  363. и всегда начинается с единицы, в отличие от
  364. <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>.
  365. Это значение увеличивается на единицу с каждой следующей итерацией.
  366. </p>
  367. <div class="example">
  368. <a name="id2669315"></a><p class="title"><b>Example 7.11. Примеры работы с <em class="parameter"><code>iteration</code></em> и <em class="parameter"><code>index</code></em></b></p>
  369. <div class="example-contents"><pre class="programlisting">
  370.  
  371. {* этот шаблон выведет 0|1, 1|2, 2|3, ... и т.д. *}
  372. {foreach from=$myArray item=i name=foo}
  373. {$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
  374. {/foreach}
  375.  
  376. </pre></div>
  377. </div>
  378. <br class="example-break">
  379. </div>
  380. <div class="sect2" title=".first">
  381. <div class="titlepage"><div><div><h3 class="title">
  382. <a name="foreach.property.first"></a>.first</h3></div></div></div>
  383. <p>
  384. Свойство <em class="parameter"><code>first</code></em> равно <code class="constant">TRUE</code>, если текущая итерация
  385. <code class="varname">{foreach}</code> - первая.
  386. </p>
  387. <div class="example">
  388. <a name="id2669377"></a><p class="title"><b>Example 7.12. Пример использования свойства <em class="parameter"><code>first</code></em></b></p>
  389. <div class="example-contents"><pre class="programlisting">
  390.  
  391. {* отображаем "НОВОЕ" напротив первого элемента, иначе id *}
  392. &lt;table&gt;
  393. {foreach from=$items key=myId item=i name=foo}
  394. &lt;tr&gt;
  395. &lt;td&gt;{if $smarty.foreach.foo.first}НОВОЕ{else}{$myId}{/if}&lt;/td&gt;
  396. &lt;td&gt;{$i.label}&lt;/td&gt;
  397. &lt;/tr&gt;
  398. {/foreach}
  399. &lt;/table&gt;
  400.  
  401. </pre></div>
  402. </div>
  403. <br class="example-break">
  404. </div>
  405. <div class="sect2" title=".last">
  406. <div class="titlepage"><div><div><h3 class="title">
  407. <a name="foreach.property.last"></a>.last</h3></div></div></div>
  408. <p>
  409. Свойство <em class="parameter"><code>last</code></em> равно <code class="constant">TRUE</code>, если текущая итерация
  410. <code class="varname">{foreach}</code> - последняя.
  411. </p>
  412. <div class="example">
  413. <a name="id2669436"></a><p class="title"><b>Example 7.13. Пример использования свойства <em class="parameter"><code>last</code></em></b></p>
  414. <div class="example-contents"><pre class="programlisting">
  415.  
  416. {* Добавляем горизонтальную полосу (&lt;hr /&gt;) в конце списка *}
  417. {foreach from=$items key=part_id item=prod name=products}
  418. &lt;a href="#{$part_id}"&gt;{$prod}&lt;/a&gt;{if $smarty.foreach.products.last}&lt;hr /&gt;{else},{/if}
  419. {foreachelse}
  420. ... content ...
  421. {/foreach}
  422.  
  423. </pre></div>
  424. </div>
  425. <br class="example-break">
  426. </div>
  427. <div class="sect2" title=".show">
  428. <div class="titlepage"><div><div><h3 class="title">
  429. <a name="foreach.property.show"></a>.show</h3></div></div></div>
  430. <p>
  431. <em class="parameter"><code>show</code></em> используется как параметр для <code class="varname">{foreach}</code>.
  432. <em class="parameter"><code>show</code></em> - это булевое значение.
  433. Если оно равно <code class="constant">FALSE</code>, результат работы <code class="varname">{foreach}</code> не будет отображен.
  434. Если присутствует директива <code class="varname">{foreachelse}</code>, её содержимое
  435. будет отображено.
  436. </p>
  437. </div>
  438. <div class="sect2" title=".total">
  439. <div class="titlepage"><div><div><h3 class="title">
  440. <a name="foreach.property.total"></a>.total</h3></div></div></div>
  441. <p>
  442. <em class="parameter"><code>total</code></em> содержит общее количество итераций,
  443. которое пройдет данный цикл <code class="varname">{foreach}</code>.
  444. Его можно использовать во время или после выполнения <code class="varname">{foreach}</code>.
  445. </p>
  446. <div class="example">
  447. <a name="id2669551"></a><p class="title"><b>Example 7.14. Пример использования свойства <em class="parameter"><code>total</code></em></b></p>
  448. <div class="example-contents"><pre class="programlisting">
  449.  
  450. {* отображаем количество отображенных строк в конце *}
  451. {foreach from=$items key=part_id item=prod name=foo}
  452. {$prod.name}&lt;hr/&gt;
  453. {if $smarty.foreach.foo.last}
  454. &lt;div id="total"&gt;{$smarty.foreach.foo.total} предметов&lt;/div&gt;
  455. {/if}
  456. {foreachelse}
  457. ... что-то другое ...
  458. {/foreach}
  459.  
  460. </pre></div>
  461. </div>
  462. <br class="example-break"><p>
  463. См. также
  464. <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
  465. и
  466. <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}, {$smarty.foreach}"><em class="parameter"><code>$smarty.foreach</code></em></a>.
  467. </p>
  468. </div>
  469. </div>
  470. <div class="navfooter">
  471. <hr>
  472. <table width="100%" summary="Navigation footer">
  473. <tr>
  474. <td width="40%" align="left">
  475. <a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
  476. <td width="20%" align="center"><a accesskey="u" href="language.builtin.functions.html">Up</a></td>
  477. <td width="40%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
  478. </td>
  479. </tr>
  480. <tr>
  481. <td width="40%" align="left" valign="top">{config_load} </td>
  482. <td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
  483. <td width="40%" align="right" valign="top"> {if},{elseif},{else}</td>
  484. </tr>
  485. </table>
  486. </div>
  487. </body>
  488. </html>