- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>{foreach},{foreachelse}</title>
- <meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
- <link rel="home" href="index.html" title="Руководство по Smarty">
- <link rel="up" href="language.builtin.functions.html" title="Chapter 7. Встроенные функции">
- <link rel="prev" href="language.function.config.load.html" title="{config_load}">
- <link rel="next" href="language.function.if.html" title="{if},{elseif},{else}">
- </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">{foreach},{foreachelse}</th></tr>
- <tr>
- <td width="20%" align="left">
- <a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
- <th width="60%" align="center">Chapter 7. Встроенные функции</th>
- <td width="20%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
- </td>
- </tr>
- </table>
- <hr>
- </div>
- <div class="sect1" title="{foreach},{foreachelse}">
- <div class="titlepage"><div><div><h2 class="title" style="clear: both">
- <a name="language.function.foreach"></a>{foreach},{foreachelse}</h2></div></div></div>
- <p>
- <code class="varname">{foreach}</code> используется для работы как с
- <span class="bold"><strong>ассоциативным</strong></span>,
- так и с числовыми массивами, в отличие от функции
- <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>,
- которая предназначена для работы
- <span class="bold"><strong>исключительно с числовыми массивами</strong></span>.
-
- Синтаксис функции <code class="varname">{foreach}</code> намного проще, чем
- <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>,
- но она может работать <span class="bold"><strong>только с одним массивом</strong></span>
- одновременно. Каждый тэг <code class="varname">{foreach}</code> должен иметь
- закрывающую пару <code class="varname">{/foreach}</code>.
- </p>
- <div class="informaltable"><table border="1">
- <colgroup>
- <col align="center">
- <col align="center">
- <col align="center">
- <col align="center">
- <col>
- </colgroup>
- <thead><tr>
- <th align="center">Имя атрибута</th>
- <th align="center">Тип</th>
- <th align="center">Обязателен</th>
- <th align="center">По умолчанию</th>
- <th>Описание</th>
- </tr></thead>
- <tbody>
- <tr>
- <td align="center">from</td>
- <td align="center">array</td>
- <td align="center">Да</td>
- <td align="center"><span class="emphasis"><em>n/a</em></span></td>
- <td>Массив, по которому надо пройтись</td>
- </tr>
- <tr>
- <td align="center">item</td>
- <td align="center">string</td>
- <td align="center">Да</td>
- <td align="center"><span class="emphasis"><em>n/a</em></span></td>
- <td>Имя переменной, которая будет значением текущего елемента</td>
- </tr>
- <tr>
- <td align="center">key</td>
- <td align="center">string</td>
- <td align="center">Нет</td>
- <td align="center"><span class="emphasis"><em>n/a</em></span></td>
- <td>Имя переменной, которая будет ключом текущего елемента</td>
- </tr>
- <tr>
- <td align="center">name</td>
- <td align="center">string</td>
- <td align="center">Нет</td>
- <td align="center"><span class="emphasis"><em>n/a</em></span></td>
- <td>Название цикла foreach для доступа к его свойствам</td>
- </tr>
- </tbody>
- </table></div>
- <div class="itemizedlist"><ul class="itemizedlist" type="disc">
- <li class="listitem"><p>
- Атрибуты <em class="parameter"><code>from</code></em> и <em class="parameter"><code>item</code></em>
- являются обязательными.
- </p></li>
- <li class="listitem"><p>
- Параметр <em class="parameter"><code>name</code></em> цикла <code class="varname">{foreach}</code>
- может состоять из букв, цифр и знака подчеркивания, как и
- <a class="ulink" href="http://php.net/language.variables" target="_top">переменные PHP</a>.
- </p></li>
- <li class="listitem"><p>
- Циклы <code class="varname">{foreach}</code> могут быть вложенными при условии, что
- их имена будут уникальными.
- </p></li>
- <li class="listitem"><p>
- Атрибут <em class="parameter"><code>from</code></em>, обычно являющийся массивом,
- определяет количество проходов цикла <code class="varname">{foreach}</code>.
- </p></li>
- <li class="listitem"><p>
- Блок <code class="varname">{foreachelse}</code> выполняется в том случае, если
- в параметре <em class="parameter"><code>from</code></em> нет значений.
- </p></li>
- <li class="listitem">
- <p>
- У циклов <code class="varname">{foreach}</code> также есть собственные переменные,
- которые обрабатывают свойства.
- Доступ к ним можно получить таким образом:
- <a class="link" href="language.variables.smarty.html#language.variables.smarty.loops" title="{$smarty.section}, {$smarty.foreach}">
- <em class="parameter"><code>{$smarty.foreach.name.property}</code></em></a>, где
- <span class="quote">“<span class="quote">name</span>”</span> - атрибут <em class="parameter"><code>name</code></em> функции
- <code class="varname">{foreach}</code>.
- </p>
- <div class="note" title="Обратите внимание" style="margin-left: 0.5in; margin-right: 0.5in;">
- <h3 class="title">Обратите внимание</h3>
- <p>
- Атрибут <em class="parameter"><code>name</code></em> необходим только в том случае,
- когда у вас есть необходимость обращаться к свойствам
- <code class="varname">{foreach}</code>, в отличие от функции
- <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>.
- Обращение к свойствам <code class="varname">{foreach}</code> с неопределенным
- <em class="parameter"><code>name</code></em> не вызывает ошибки, но ведёт к непредсказуемым
- результатам.
- </p>
- </div>
- </li>
- <li class="listitem"><p>
- <code class="varname">{foreach}</code> имеет следующие свойства:
- <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>,
- <a class="link" href="language.function.foreach.html#foreach.property.iteration" title=".iteration"><em class="parameter"><code>iteration</code></em></a>,
- <a class="link" href="language.function.foreach.html#foreach.property.first" title=".first"><em class="parameter"><code>first</code></em></a>,
- <a class="link" href="language.function.foreach.html#foreach.property.last" title=".last"><em class="parameter"><code>last</code></em></a>,
- <a class="link" href="language.function.foreach.html#foreach.property.show" title=".show"><em class="parameter"><code>show</code></em></a> и
- <a class="link" href="language.function.foreach.html#foreach.property.total" title=".total"><em class="parameter"><code>total</code></em></a>.
- </p></li>
- </ul></div>
- <div class="example">
- <a name="id2668883"></a><p class="title"><b>Example 7.5. Атрибут <em class="parameter"><code>item</code></em></b></p>
- <div class="example-contents">
- <pre class="programlisting">
-
- <?php
- $arr = array(1000, 1001, 1002);
- $smarty->assign('myArray', $arr);
- ?>
-
- </pre>
- <p>
- Шаблон для отображения <em class="parameter"><code>$myArray</code></em> в виде
- ненумерованного списка
- </p>
- <pre class="programlisting">
-
- <ul>
- {foreach from=$myArray item=foo}
- <li>{$foo}</li>
- {/foreach}
- </ul>
-
- </pre>
- <p>
- Результат выполнения данного примера:
- </p>
- <pre class="screen">
-
- <ul>
- <li>1000</li>
- <li>1001</li>
- <li>1002</li>
- </ul>
-
- </pre>
- </div>
- </div>
- <br class="example-break"><div class="example">
- <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>
- <div class="example-contents">
- <pre class="programlisting">
-
- <?php
- $arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding');
- $smarty->assign('myArray', $arr);
- ?>
-
- </pre>
- <p>
- Шаблон для отображения <em class="parameter"><code>$myArray</code></em> в виде пар ключ/значение,
- как <a class="ulink" href="http://php.net/foreach" target="_top"><code class="varname">foreach</code></a>
- в PHP.</p>
- <pre class="programlisting">
-
- <ul>
- {foreach from=$myArray key=k item=v}
- <li>{$k}: {$v}</li>
- {/foreach}
- </ul>
-
- </pre>
- <p>
- Результат выполнения данного примера:
- </p>
- <pre class="screen">
-
- <ul>
- <li>9: Tennis</li>
- <li>3: Swimming</li>
- <li>8: Coding</li>
- </ul>
-
- </pre>
- </div>
- </div>
- <br class="example-break"><div class="example">
- <a name="id2669014"></a><p class="title"><b>Example 7.7. {foreach} с ассоциативным атрибутом <em class="parameter"><code>item</code></em></b></p>
- <div class="example-contents">
- <pre class="programlisting">
-
- <?php
- $items_list = array(23 => array('no' => 2456, 'label' => 'Salad'),
- 96 => array('no' => 4889, 'label' => 'Cream')
- );
- $smarty->assign('items', $items_list);
- ?>
-
- </pre>
- <p>
- Шаблон для отображения элементов <em class="parameter"><code>$items</code></em>, в котором
- <em class="parameter"><code>$myId</code></em> используется в URL'е
- </p>
- <pre class="programlisting">
-
- <ul>
- {foreach from=$items key=myId item=i}
- <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
- {/foreach}
- </ul>
-
- </pre>
- <p>
- Результат выполнения данного примера:
- </p>
- <pre class="screen">
-
- <ul>
- <li><a href="item.php?id=23">2456: Salad</li>
- <li><a href="item.php?id=96">4889: Cream</li>
- </ul>
-
- </pre>
- </div>
- </div>
- <br class="example-break"><div class="example">
- <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>
- <div class="example-contents">
- <p>В Smarty передан такой массив, ключ которого содержит ключ для каждого перебираемого значения.</p>
- <pre class="programlisting">
-
- <?php
- $smarty->assign('contacts', array(
- array('phone' => '1',
- 'fax' => '2',
- 'cell' => '3'),
- array('phone' => '555-4444',
- 'fax' => '555-3333',
- 'cell' => '760-1234')
- ));
- ?>
-
- </pre>
- <p>Шаблон для отображения <em class="parameter"><code>$contact</code></em>.</p>
- <pre class="programlisting">
-
- {foreach name=outer item=contact from=$contacts}
- <hr />
- {foreach key=key item=item from=$contact}
- {$key}: {$item}<br />
- {/foreach}
- {/foreach}
-
- </pre>
- <p>
- Результат выполнения данного примера:
- </p>
- <pre class="screen">
-
- <hr />
- phone: 1<br />
- fax: 2<br />
- cell: 3<br />
- <hr />
- phone: 555-4444<br />
- fax: 555-3333<br />
- cell: 760-1234<br />
-
- </pre>
- </div>
- </div>
- <br class="example-break"><div class="example">
- <a name="id2669163"></a><p class="title"><b>Example 7.9. Пример использования {foreachelse} при работе с базой данных</b></p>
- <div class="example-contents">
- <p>
- Пример работы с базой данных (при помощи PEAR или ADODB) в скрипте поиска,
- результаты которого передаются в Smarty.
- </p>
- <pre class="programlisting">
-
- <?php
- $search_condition = "WHERE name LIKE '$foo%' ";
- $sql = 'SELECT contact_id, name, nick FROM contacts '.$search_condition.' ORDER BY name';
- $smarty->assign('results', $db->getAssoc($sql) );
- ?>
-
- </pre>
- <p>
- Шаблон отобразит сообщение <span class="quote">“<span class="quote">Ничего не найдено</span>”</span> при помощи
- <code class="varname">{foreachelse}</code> в случае, если поиск не дал результатов.
- </p>
- <pre class="programlisting">
-
- {foreach key=cid item=con from=$results}
- <a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
- {foreachelse}
- Ничего не найдено
- {/foreach}
-
- </pre>
- </div>
- </div>
- <br class="example-break"><div class="sect2" title=".index">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="foreach.property.index"></a>.index</h3></div></div></div>
- <p>
- <em class="parameter"><code>index</code></em> contains the current array index, starting with zero.
- </p>
- <div class="example">
- <a name="id2669249"></a><p class="title"><b>Example 7.10. <em class="parameter"><code>index</code></em> example</b></p>
- <div class="example-contents"><pre class="programlisting">
-
- {* The header block is output every five rows *}
- <table>
- {foreach from=$items key=myId item=i name=foo}
- {if $smarty.foreach.foo.index % 5 == 0}
- <tr><th>Title</th></tr>
- {/if}
- <tr><td>{$i.label}</td></tr>
- {/foreach}
- </table>
-
- </pre></div>
- </div>
- <br class="example-break">
- </div>
- <div class="sect2" title=".iteration">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="foreach.property.iteration"></a>.iteration</h3></div></div></div>
- <p>
- <em class="parameter"><code>iteration</code></em> содержит значение текущей итерации цикла
- и всегда начинается с единицы, в отличие от
- <a class="link" href="language.function.foreach.html#foreach.property.index" title=".index"><em class="parameter"><code>index</code></em></a>.
- Это значение увеличивается на единицу с каждой следующей итерацией.
- </p>
- <div class="example">
- <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>
- <div class="example-contents"><pre class="programlisting">
-
- {* этот шаблон выведет 0|1, 1|2, 2|3, ... и т.д. *}
- {foreach from=$myArray item=i name=foo}
- {$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
- {/foreach}
-
- </pre></div>
- </div>
- <br class="example-break">
- </div>
- <div class="sect2" title=".first">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="foreach.property.first"></a>.first</h3></div></div></div>
- <p>
- Свойство <em class="parameter"><code>first</code></em> равно <code class="constant">TRUE</code>, если текущая итерация
- <code class="varname">{foreach}</code> - первая.
- </p>
- <div class="example">
- <a name="id2669377"></a><p class="title"><b>Example 7.12. Пример использования свойства <em class="parameter"><code>first</code></em></b></p>
- <div class="example-contents"><pre class="programlisting">
-
- {* отображаем "НОВОЕ" напротив первого элемента, иначе id *}
- <table>
- {foreach from=$items key=myId item=i name=foo}
- <tr>
- <td>{if $smarty.foreach.foo.first}НОВОЕ{else}{$myId}{/if}</td>
- <td>{$i.label}</td>
- </tr>
- {/foreach}
- </table>
-
- </pre></div>
- </div>
- <br class="example-break">
- </div>
- <div class="sect2" title=".last">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="foreach.property.last"></a>.last</h3></div></div></div>
- <p>
- Свойство <em class="parameter"><code>last</code></em> равно <code class="constant">TRUE</code>, если текущая итерация
- <code class="varname">{foreach}</code> - последняя.
- </p>
- <div class="example">
- <a name="id2669436"></a><p class="title"><b>Example 7.13. Пример использования свойства <em class="parameter"><code>last</code></em></b></p>
- <div class="example-contents"><pre class="programlisting">
-
- {* Добавляем горизонтальную полосу (<hr />) в конце списка *}
- {foreach from=$items key=part_id item=prod name=products}
- <a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr />{else},{/if}
- {foreachelse}
- ... content ...
- {/foreach}
-
- </pre></div>
- </div>
- <br class="example-break">
- </div>
- <div class="sect2" title=".show">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="foreach.property.show"></a>.show</h3></div></div></div>
- <p>
- <em class="parameter"><code>show</code></em> используется как параметр для <code class="varname">{foreach}</code>.
- <em class="parameter"><code>show</code></em> - это булевое значение.
- Если оно равно <code class="constant">FALSE</code>, результат работы <code class="varname">{foreach}</code> не будет отображен.
- Если присутствует директива <code class="varname">{foreachelse}</code>, её содержимое
- будет отображено.
- </p>
- </div>
- <div class="sect2" title=".total">
- <div class="titlepage"><div><div><h3 class="title">
- <a name="foreach.property.total"></a>.total</h3></div></div></div>
- <p>
- <em class="parameter"><code>total</code></em> содержит общее количество итераций,
- которое пройдет данный цикл <code class="varname">{foreach}</code>.
- Его можно использовать во время или после выполнения <code class="varname">{foreach}</code>.
- </p>
- <div class="example">
- <a name="id2669551"></a><p class="title"><b>Example 7.14. Пример использования свойства <em class="parameter"><code>total</code></em></b></p>
- <div class="example-contents"><pre class="programlisting">
-
- {* отображаем количество отображенных строк в конце *}
- {foreach from=$items key=part_id item=prod name=foo}
- {$prod.name}<hr/>
- {if $smarty.foreach.foo.last}
- <div id="total">{$smarty.foreach.foo.total} предметов</div>
- {/if}
- {foreachelse}
- ... что-то другое ...
- {/foreach}
-
- </pre></div>
- </div>
- <br class="example-break"><p>
- См. также
- <a class="link" href="language.function.section.html" title="{section},{sectionelse}"><code class="varname">{section}</code></a>
- и
- <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>.
- </p>
- </div>
- </div>
- <div class="navfooter">
- <hr>
- <table width="100%" summary="Navigation footer">
- <tr>
- <td width="40%" align="left">
- <a accesskey="p" href="language.function.config.load.html">Prev</a> </td>
- <td width="20%" align="center"><a accesskey="u" href="language.builtin.functions.html">Up</a></td>
- <td width="40%" align="right"> <a accesskey="n" href="language.function.if.html">Next</a>
- </td>
- </tr>
- <tr>
- <td width="40%" align="left" valign="top">{config_load} </td>
- <td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
- <td width="40%" align="right" valign="top"> {if},{elseif},{else}</td>
- </tr>
- </table>
- </div>
- </body>
- </html>