В этом примере используется index , вы получите 11 результатов.См. Мои заметки
{foreach from=$entries key=i item=topic name=foo} // note (1)
{if $smarty.foreach.foo.index == 10} // notes (2.1, 2.2 and 2.3)
{php}break;{/php} // note (2.4)
{/if}
{if $topic.topic_style == question} // note (3)
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
Заметки
(1) Если вы не используете ключ, нет необходимости определять его
(2.1) Есливы используете index начало цикла 0, используя iteration вместо счетчика, начинающегося с 1, для простого инкрементного подсчета используйте iteration not index .
(2.2) Хотя в коде smarty все нормально, вы используете ==,! = И т. Д., Для удобства чтения лучше использовать eq, neq, is, not, и / или. список можно продолжить, полный список см. в документации smarty.
(2.3) Я отметил выше об 11 результатах, используя index .Это может произойти в приведенном выше примере просто потому, что число равно 10, чтобы получить результат 10 для печати разрыва, вам нужно было бы использовать 9 в качестве значения.
(2.4) Вместо этого используйте умный разрыв,вам не обязательно писать умный плагин, есть множество плагинов, доступных для установки.
(3) Как и в PHP, вам не нужно использовать кавычки для переменных, целых чисел, констант или логических значений.строка не является ни одной из них и должна быть заключена в кавычки.
Старая редакция
{foreach from=$entries item=topic name=foo}
{if $smarty.foreach.foo.iteration eq 10}
{break}
{/if}
{if $topic.topic_style eq "question"}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
Я переосмыслил это, и в результате я выяснилЧтобы полностью исключить необходимость прерывания, цикл просто завершится на последней итерации.почему я не думал об этом раньше, я не знаю, но в любом случае, вот лучший способ закончить цикл без прерывания. lte и le оба означают меньше или равно, точно так же, как PHP <= </p>
Вы также можете использовать neq (не равнок) и сделать число 11, но если у вас будет больше результатов в массиве, он просто пропустит итерацию 11 и продолжит работу до конца массива.Если у вас есть только 10 элементов в массиве, вы можете использовать любой из трех способов, но для простоты в этом случае я бы придерживался операторов менее равных.
Теперь вы заметите, что этот цикл foreach очень велик
The Better Revision
{foreach from=$entries item=topic name=foo}
{if $smarty.foreach.foo.iteration lte 10 AND $topic.topic_style eq "question"}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
Сводка
Короче говоря, оба способа будут работать, я отметил выше вариант с использованием оператора меньше чем синдекс, который был бы предпочтительным способом оценки.
Однако, переключаясь на итерацию, вы допускаете более прямой цикл, вам не нужно думать о том, что правильное значение, его простое, я хочу 10 результатов, так что итерационное уравнение 10 .
Небольшая боковая дорожка здесь : Другая проблема с индексом по итерации - индекс не будет отображать таблицу правильно, если вы используете модуль, Этоодинаково верно в программах PHP.Использование итерации с модулем упростит вашу жизнь.это эквивалентно установке счетчика, потому что индекс строки не будет делать то, что вам нужно.
Используя операторы smarty вместо аналогов PHP, вы можете написать более читаемый файл шаблона.Помните, что шаблоны не предназначены для логики php, они предназначены для дизайнеров внешнего интерфейса.Для программиста PHP операторы становятся второй натурой, но для дизайнера они могут быть чужды своей обычной работе.