Twig: in_array o similar posible dentro de la declaración if?

207

Estoy usando Twig como motor de plantillas y realmente me encanta. Sin embargo, ahora me he encontrado en una situación que definitivamente debe ser posible de una manera más simple de lo que he encontrado.

Lo que tengo ahora es esto:

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

Lo que estoy buscando es algo más como esto:

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

¿Hay alguna manera de lograr esto que aún no he visto?

Si necesito crear mi propia extensión, ¿cómo puedo acceder a myVar dentro de la función de prueba?

¡Gracias por tu ayuda!

esguince
fuente
3
Faaffael1984 tiene la respuesta correcta. ¡Pero lo que está intentando hacer debe hacerse en el controlador, no en la vista! Formatee su matriz y luego dele un aspecto limpio a la vista para la mejor legibilidad.
Vivien
66
Supongo que realmente depende del contexto en qué sentido tiene más sentido, ¿no te parece?
esguince

Respuestas:

459

Solo tiene que cambiar la segunda línea de su segundo bloque de código de

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

a

{% if myVar in someOtherArray|keys %}

in es el operador de contención y las claves de un filtro que devuelve una matriz de claves.

Raffael
fuente
109
Si desea lograr lo mismo que in_array () en PHP, omita el filtro de claves
Burgi
24
+ 1 Y también la negación es {% if item not in array %}y no {% if not _entry.id in array %}, por lo que es diferente de esto {% if not var is null %}.
insertusernamehere
8
También puede usar definido: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
ajustado el
90

Solo para aclarar algunas cosas aquí. La respuesta que se aceptó no hace lo mismo que PHP in_array .

Para hacer lo mismo que PHP in_array, use la siguiente expresión:

{% if myVar in myArray %}

Si desea negar esto, debe usar esto:

{% if myVar not in myArray %}
Wim Mostmans
fuente
1
Estos dos puntos parecen haber sido cubiertos por los comentarios sobre la respuesta aceptada en 2012. Esta respuesta no parece agregar nada extra.
William Isted
77
@William Isted esta respuesta agrega la forma correcta de hacer PHP in_array()en rama.
elvismdev
2
@WilliamIsted Entonces esa respuesta aceptada debe editarse para que sea correcta.
user1032531
3
Es mejor que las respuestas dadas en los comentarios se conviertan en respuestas reales, ya que es mucho más probable que se eliminen los comentarios.
Nathan Arthur
^ - eliminado o simplemente ignorado
Cid
16

Prueba esto

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

otro ejemplo que sigue a @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 %}
Estiércol
fuente
0

Aunque las respuestas anteriores son correctas, encontré algo más amigable al usar el operador ternario.

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

Si alguien necesita trabajar a través de foreach entonces,

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