{foreach} используется для работы как с
ассоциативным,
так и с числовыми массивами, в отличие от функции
{section},
которая предназначена для работы
исключительно с числовыми массивами.
Синтаксис функции {foreach} намного проще, чем
{section},
но она может работать только с одним массивом
одновременно. Каждый тэг {foreach} должен иметь
закрывающую пару {/foreach}.
| Имя атрибута | Тип | Обязателен | По умолчанию | Описание |
|---|---|---|---|---|
| from | array | Да | n/a | Массив, по которому надо пройтись |
| item | string | Да | n/a | Имя переменной, которая будет значением текущего елемента |
| key | string | Нет | n/a | Имя переменной, которая будет ключом текущего елемента |
| name | string | Нет | n/a | Название цикла foreach для доступа к его свойствам |
Атрибуты
fromиitemявляются обязательными.Параметр
nameцикла{foreach}может состоять из букв, цифр и знака подчеркивания, как и переменные PHP.Циклы
{foreach}могут быть вложенными при условии, что их имена будут уникальными.Атрибут
from, обычно являющийся массивом, определяет количество проходов цикла{foreach}.Блок
{foreachelse}выполняется в том случае, если в параметреfromнет значений.-
У циклов
{foreach}также есть собственные переменные, которые обрабатывают свойства. Доступ к ним можно получить таким образом:{$smarty.foreach.name.property}, где “name” - атрибутnameфункции{foreach}.Обратите внимание
Атрибут
nameнеобходим только в том случае, когда у вас есть необходимость обращаться к свойствам{foreach}, в отличие от функции{section}. Обращение к свойствам{foreach}с неопределеннымnameне вызывает ошибки, но ведёт к непредсказуемым результатам. {foreach}имеет следующие свойства:index,iteration,first,last,showиtotal.
Example 7.5. Атрибут item
<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>
Шаблон для отображения $myArray в виде
ненумерованного списка
<ul>
{foreach from=$myArray item=foo}
<li>{$foo}</li>
{/foreach}
</ul>
Результат выполнения данного примера:
<ul>
<li>1000</li>
<li>1001</li>
<li>1002</li>
</ul>
Example 7.6. Пример работы атрибутов item и key
<?php
$arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding');
$smarty->assign('myArray', $arr);
?>
Шаблон для отображения $myArray в виде пар ключ/значение,
как foreach
в PHP.
<ul>
{foreach from=$myArray key=k item=v}
<li>{$k}: {$v}</li>
{/foreach}
</ul>
Результат выполнения данного примера:
<ul>
<li>9: Tennis</li>
<li>3: Swimming</li>
<li>8: Coding</li>
</ul>
Example 7.7. {foreach} с ассоциативным атрибутом item
<?php
$items_list = array(23 => array('no' => 2456, 'label' => 'Salad'),
96 => array('no' => 4889, 'label' => 'Cream')
);
$smarty->assign('items', $items_list);
?>
Шаблон для отображения элементов $items, в котором
$myId используется в URL'е
<ul>
{foreach from=$items key=myId item=i}
<li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
{/foreach}
</ul>
Результат выполнения данного примера:
<ul> <li><a href="item.php?id=23">2456: Salad</li> <li><a href="item.php?id=96">4889: Cream</li> </ul>
Example 7.8. {foreach} со вложенными item и key
В Smarty передан такой массив, ключ которого содержит ключ для каждого перебираемого значения.
<?php
$smarty->assign('contacts', array(
array('phone' => '1',
'fax' => '2',
'cell' => '3'),
array('phone' => '555-4444',
'fax' => '555-3333',
'cell' => '760-1234')
));
?>
Шаблон для отображения $contact.
{foreach name=outer item=contact from=$contacts}
<hr />
{foreach key=key item=item from=$contact}
{$key}: {$item}<br />
{/foreach}
{/foreach}
Результат выполнения данного примера:
<hr /> phone: 1<br /> fax: 2<br /> cell: 3<br /> <hr /> phone: 555-4444<br /> fax: 555-3333<br /> cell: 760-1234<br />
Example 7.9. Пример использования {foreachelse} при работе с базой данных
Пример работы с базой данных (при помощи PEAR или ADODB) в скрипте поиска, результаты которого передаются в Smarty.
<?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) );
?>
Шаблон отобразит сообщение “Ничего не найдено” при помощи
{foreachelse} в случае, если поиск не дал результатов.
{foreach key=cid item=con from=$results}
<a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
{foreachelse}
Ничего не найдено
{/foreach}
index contains the current array index, starting with zero.
Example 7.10. index example
{* 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>
iteration содержит значение текущей итерации цикла
и всегда начинается с единицы, в отличие от
index.
Это значение увеличивается на единицу с каждой следующей итерацией.
Example 7.11. Примеры работы с iteration и index
{* этот шаблон выведет 0|1, 1|2, 2|3, ... и т.д. *}
{foreach from=$myArray item=i name=foo}
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}
Свойство first равно TRUE, если текущая итерация
{foreach} - первая.
Example 7.12. Пример использования свойства first
{* отображаем "НОВОЕ" напротив первого элемента, иначе 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>
Свойство last равно TRUE, если текущая итерация
{foreach} - последняя.
Example 7.13. Пример использования свойства last
{* Добавляем горизонтальную полосу (<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}
show используется как параметр для {foreach}.
show - это булевое значение.
Если оно равно FALSE, результат работы {foreach} не будет отображен.
Если присутствует директива {foreachelse}, её содержимое
будет отображено.
total содержит общее количество итераций,
которое пройдет данный цикл {foreach}.
Его можно использовать во время или после выполнения {foreach}.
Example 7.14. Пример использования свойства total
{* отображаем количество отображенных строк в конце *}
{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}
См. также
{section}
и
$smarty.foreach.