Twig: in_array чи подібне можливо в операторі if?


207

Я використовую Twig в якості шаблону двигуна, і я дуже люблю його. Однак зараз я опинився в ситуації, яка, безумовно, повинна бути виконаною більш простим способом, ніж я знайшов.

Я маю зараз таке:

{% for myVar in someArray %}    
    {% set found = 0 %}
    {% for id, data in someOtherArray %}
        {% if id == myVar %}
            {{ myVar }} exists within someOtherArray.
            {% set found = 1 %} 
        {% endif %}
    {% endfor %}

    {% if found == 0 %}
        {{ myVar }} doesn't exist within someOtherArray.
    {% endif %}
{% endfor %}

Що я шукаю, це щось подібне:

{% for myVar in someArray %}    
    {% if myVar is in_array(array_keys(someOtherArray)) %}
       {{ myVar }} exists within someOtherArray.
    {% else %}
       {{ myVar }} doesn't exist within someOtherArray.
    {% endif %}
{% endfor %}

Чи є спосіб досягти цього, якого я ще не бачив?

Якщо мені потрібно створити власне розширення, як я можу отримати доступ до myVar в рамках тестової функції?

Спасибі за вашу допомогу!


3
Яффаел1984 має правильну відповідь. Але те, що ви намагаєтеся зробити, повинно бути зроблено в контролері, а не в погляді! Відформатуйте свій масив, а потім надайте чисту річ перегляду для найкращої читабельності.
Вів'єн

6
Я думаю, це дійсно залежить від контексту, який спосіб має більше сенсу, ви не думаєте?
розпилення

Відповіді:


459

Вам просто потрібно змінити другий рядок другого блоку коду

{% if myVar is in_array(array_keys(someOtherArray)) %}

до

{% if myVar in someOtherArray|keys %}

в - оператор стримування і клавіть фільтр, який повертає ключі масивів.


109
Якщо ви хочете домогтися того, як in_array () в PHP, опустіть фільтр ключів
Burgi

24
+ 1 А також заперечення є {% if item not in array %}і немає {% if not _entry.id in array %}, тому воно відрізняється від цього {% if not var is null %}.
Вставтекористувач

8
Ви також можете використовувати визначені: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
жорсткий

90

Просто, щоб прояснити деякі речі тут. Відповідь, яку було прийнято, не відповідає тому, як PHP in_array .

Щоб зробити те саме, що і PHP in_array, використовуйте наступне вираження:

{% if myVar in myArray %}

Якщо ви хочете заперечити це, скористайтеся цим:

{% if myVar not in myArray %}

1
Ці два моменти, схоже, були охоплені коментарями до прийнятої відповіді ще у 2012 році. Ця відповідь, здається, не додає нічого зайвого.
Вільям Істед

7
@William Isted ця відповідь додає правильний спосіб зробити PHP in_array()в гілочку.
elvismdev

2
@WilliamIsted Тоді цю прийняту відповідь слід редагувати, щоб вона була правильною.
користувач1032531

3
Краще, щоб відповіді, подані в коментарях, перетворилися на фактичні відповіді, оскільки коментарі набагато частіше видаляються.
Натан Артур

^ - видалено або просто проігноровано
Cid


10

ще один приклад після @jake stayman:

{% for key, item in row.divs %}
    {% if (key not in [1,2,9]) %} // eliminate element 1,2,9
        <li>{{ item }}</li>
    {% endif %}
{% endfor %}


0

Хоча вищенаведені відповіді вірні, я знайшов щось більш зручний для користувачів під час використання термінального оператора.

{{ attachment in item['Attachments'][0] ? 'y' : 'n' }}

Якщо комусь потрібно працювати через foreach,

{% for attachment in attachments %}
    {{ attachment in item['Attachments'][0] ? 'y' : 'n' }}
{% endfor %}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.