261 votes

Twig : in_array ou similaire possible dans l'instruction if ?

J'utilise Brindille comme moteur de templating et je l'aime beaucoup. Cependant, je me suis retrouvé dans une situation qui doit absolument être réalisable d'une manière plus simple que celle que j'ai trouvée.

Ce que j'ai pour l'instant, c'est ceci :

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

Ce que je recherche, c'est quelque chose comme ceci :

{% 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-t-il un moyen d'y parvenir que je n'ai pas encore vu ?

Si je dois créer ma propre extension, comment puis-je accéder à myVar dans la fonction de test ?

Merci de votre aide !

6 votes

Affael1984 a la bonne réponse. Mais ce que vous essayez de faire devrait être fait dans le contrôleur, pas dans la vue ! Formatez votre tableau et ensuite donnez une chose propre à la vue pour une meilleure lisibilité.

7 votes

Je suppose que cela dépend vraiment du contexte et qu'il est plus logique de choisir l'une ou l'autre voie, n'est-ce pas ?

536voto

Raffael Points 5837

Il vous suffit de changer la deuxième ligne de votre deuxième bloc de code de

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

à

{% if myVar in someOtherArray|keys %}

en est l'opérateur de confinement et clés un filtre qui renvoie un tableau de clés.

123 votes

Si vous voulez obtenir le même résultat que in_array() en PHP, omettez le filtre des clés.

29 votes

+ 1 Et la négation est également {% if item not in array %} et non {% if not _entry.id in array %} Il s'agit donc d'une différence par rapport à ceci {% if not var is null %} .

9 votes

Vous pouvez également utiliser des : {% if someOtherArray.myVar is defined %} ( twig.sensiolabs.org/doc/tests/defined.html )

147voto

Wim Mostmans Points 3029

Je tiens à clarifier certains points. La réponse qui a été acceptée ne fait pas la même chose que PHP in_array .

Pour faire la même chose qu'en PHP in_array utiliser l'expression suivante :

{% if myVar in myArray %}

Si vous voulez l'annuler, vous devez utiliser ceci :

{% if myVar not in myArray %}

49voto

Arthur Veselov Points 731

Essayez ceci

{% if var in ['foo', 'bar', 'beer'] %}
    ...
{% endif %}

11voto

user1704745 Points 1

Un autre exemple suivant @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 %}

6voto

sh6210 Points 503

Bien que les réponses ci-dessus soient correctes, j'ai trouvé une approche plus conviviale en utilisant l'opérateur ternaire.

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

Si quelqu'un a besoin de travailler avec foreach alors,

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X