Smarty - цикл foreach 10 раз и остановка
Im, используя следующий код Smarty:
{foreach from=$entries key=i item=topic}
{if $topic.topic_style == question}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
Как я могу сделать {foreach} максимум 10 раз, а затем остановиться?
Ответы
Ответ 1
Вы можете использовать функцию index
и break
:
{foreach from=$entries key=i item=topic name=foo}
{if $smarty.foreach.foo.index == 10}
{break}
{/if}
{if $topic.topic_style == question}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
Функция прерывания описывается здесь:
Перерыв в режиме Smarty's/Dwoo foreach
Ответ 2
Вы можете просто использовать array_slice
:
{foreach $entries|@array_slice:0:10 as $topic}
...
{/foreach}
Ответ 3
Используйте index
:
{foreach from=$entries key=i item=topic name=foo}
{if $smarty.foreach.foo.index < 10}
{if $topic.topic_style == question}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/if}
{/foreach}
Ответ 4
В этом примере используется 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, используя Итерация, вместо этого счетчик начинается с 1, для простого инкрементного подсчета используйте итерацию не индекс.
(2.2) В то время как его штраф вы используете ==,!= и т.д. в smarty-коде, для удобства чтения лучше использовать eq, neq, is, is, и, или. список можно продолжить, см. документацию smarty для полного списка.
(2.3) Я отметил выше о 11 результатах, используя index. Это произойдет в примере выше просто потому, что число равно 10, чтобы иметь 10 результат печати перерыва, вам нужно было бы использовать 9 в качестве значения.
(2.4) Используйте вместо этого smarty break, вам необязательно писать плагин smarty, для установки доступно множество плагинов.
(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 < =
Вы также можете использовать neq (не равный) и сделать число 11, но если у вас больше результатов в массиве, он просто пропустит итерацию 11 и продолжит до конца массива. Если у вас всего 10 элементов массива, вы можете использовать любой из трех способов, но для простоты в этом случае я бы придерживался менее равных операторов.
Теперь вы заметите, что этот цикл foreach чрезвычайно чист, чтобы смотреть и понимать
Улучшенная версия
{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 результатов, поэтому итерация eq 10.
Слегка дорожка здесь. Еще одна проблема с индексом по итерации - это индекс, который не будет корректно отображать таблицу, если вы используете модуль. Это одинаково верно в программах PHP. Использование итерации с модулем облегчит вашу жизнь. его эквивалент установки счетчика, потому что индекс строки не будет делать то, что вам нужно.
Используя операторы smarty, а не PHP-копии, вы можете написать более читаемый файл шаблона. Помните, что шаблоны не предназначены для php-логики, они предназначены для дизайнеров интерфейсов. Для программистов-программистов PHP становится второй натурой, но дизайнеру может быть чуждо обычная работа.
Ответ 5
Если вы не хотите писать плагин smarty, вы также можете сделать это:
{foreach from=$entries key=i item=topic name=foo}
{if $smarty.foreach.foo.index == 10}
{php}break;{/php}
{/if}
{if $topic.topic_style == question}
<li>
<a href="topic.php?id={$topic.id}">{$topic.title}</a>
</li>
{/if}
{/foreach}
Ответ 6
Мало расширяется в smarty, чтобы ограничить foreach.
В файле: sysplugins/smarty_internal_compile_foreach.php
Добавьте ограничение к исходным атрибутам:
public $optional_attributes = array('name', 'key','limit');
Добавить после $output = "<?php ";
this >
if (isset($_attr['limit'])) {
$limit = $_attr['limit'];
$output .= "\n \$_limitCnt = 0; \n \$_limit = $limit; \n";
}
Добавить перед $output .= "?>";
this >
if (isset($_attr['limit'])) {
$output .= "\n if (\$_limitCnt == \$_limit) { break; }";
$output .= "\n \$_limitCnt++;";
}
Используйте как usuall для каждого и добавьте limit = #, чтобы ограничить ваши результаты.
Надеюсь, я помог.
Ответ 7
У Smarty 3 есть еще один вариант, если это вообще возможно, было бы целесообразным обновление. Если вы не можете обратиться к разработчику своего приложения.
{foreach $result_set as $result}
{if [email protected] lte 10}
// just as in php both forms of access are available.
{$result.assoc_key}
{$result.0}
{/if}
{/foreach}
Также стоит отметить, что Smarty 3 имеет встроенный {break}. Однако, если вы нарушаете цикл foreach до конца и практически отбрасываете оставшиеся данные, вы можете подумать, возможно ли его ограничить ваши запросы sql.