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 %}

in - оператор включения и ключей фильтр, который возвращает ключи массивов.

Раффаэль
источник
109
Если вы хотите добиться того же, что и in_array () в PHP, пропустите фильтр ключей
Burgi
24
+1 А также отрицание есть {% if item not in array %}и нет {% if not _entry.id in array %}, поэтому отличается от этого {% if not var is null %}.
insertusername здесь
8
Вы также можете использовать определенные: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
плотный
91

Просто чтобы прояснить некоторые вещи здесь. Принятый ответ не соответствует 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 Тогда этот принятый ответ нужно отредактировать, чтобы он был правильным.
user1032531
3
Лучше, чтобы ответы, приведенные в комментариях, превращались в реальные ответы, так как комментарии с большей вероятностью будут удалены.
Натан Артур
^ - удалено или просто проигнорировано
Cid
16

Попробуй это

{% if var in ['foo', 'bar', 'beer'] %}
    ...
{% endif %}
Артур Веселов
источник
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 %}
sh6210
источник