Подтвердить что ты не робот

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 раз, а затем остановиться?

4b9b3361

Ответ 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.