Twig: in_array ou similar possível dentro da instrução if?

207

Estou usando o Twig como mecanismo de modelagem e estou realmente adorando. No entanto, agora corri em uma situação que definitivamente deve ser realizada de uma maneira mais simples do que encontrei.

O que tenho agora é o seguinte:

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

O que estou procurando é algo mais ou menos assim:

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

Existe uma maneira de conseguir isso que eu ainda não vi?

Se eu precisar criar minha própria extensão, como posso acessar o myVar na função de teste?

Obrigado pela ajuda!

entorse
fonte
3
Яaffael1984 tem a resposta certa. Mas o que você está tentando fazer deve ser feito no controlador, não na vista! Formate sua matriz e, em seguida, dê uma olhada na visualização para obter a melhor legibilidade.
Vivien
6
Suponho que realmente depende do contexto de que maneira faz mais sentido, você não acha?
entorse

Respostas:

459

Você só precisa alterar a segunda linha do seu segundo bloco de código de

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

para

{% if myVar in someOtherArray|keys %}

em é o operador de confinamento e codifica um filtro que retorna as chaves de uma matriz.

Raffael
fonte
109
Se você deseja alcançar o mesmo que in_array () em PHP, omitir o filtro de chaves
Burgi
24
+ 1 E também a negação é {% if item not in array %}e não {% if not _entry.id in array %}, então é diferente disso {% if not var is null %}.
insertusernamehere
8
Você também pode usar definido: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
tight
90

Só para esclarecer algumas coisas aqui em cima. A resposta que foi aceita não faz o mesmo que PHP in_array do .

Para fazer o mesmo que PHP in_array, use a seguinte expressão:

{% if myVar in myArray %}

Se você quiser negar isso, use:

{% if myVar not in myArray %}
Wim Mostmans
fonte
1
Esses dois pontos parecem ter sido abordados pelos comentários sobre a resposta aceita em 2012. Essa resposta não parece acrescentar nada extra.
William isTed
7
@ William Isted esta resposta adiciona o caminho certo para fazer PHP in_array()no galho.
Elvismdev 8/04
2
@WilliamIsted Em seguida, essa resposta aceita deve ser editada para estar correta.
User1032531
3
É melhor que as respostas fornecidas nos comentários sejam transformadas em respostas reais, pois é muito mais provável que os comentários sejam excluídos.
22618 Nathan Arthur
^ - excluído ou simplesmente ignorados
Cid
16

Tente isto

{% if var in ['foo', 'bar', 'beer'] %}
    ...
{% endif %}
Arthur Veselov
fonte
10

outro exemplo a seguir @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 %}
Estrume
fonte
0

Embora as respostas acima estejam corretas, achei uma abordagem mais amigável ao usar o operador ternário.

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

Se alguém precisar trabalhar com o foreach então,

{% for attachment in attachments %}
    {{ attachment in item['Attachments'][0] ? 'y' : 'n' }}
{% endfor %}
sh6210
fonte