<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>