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!


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.


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

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


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


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 %}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.