{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
.
Пример 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>
Пример 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>
Пример 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>
Пример 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 />
Пример 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.
Пример 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
.
Это значение увеличивается на единицу с каждой следующей итерацией.
Пример 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}
- первая.
Пример 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}
- последняя.
Пример 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}
.
Пример 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
.