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

207

J'utilise Twig comme moteur de template et je l'adore vraiment. Cependant, maintenant j'ai couru dans une situation qui doit certainement être réalisable d'une manière plus simple que je ne l'ai trouvée.

Ce que j'ai en ce moment, 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 %}

Y a-t-il un moyen d'accomplir cela 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!

entorse
la source
3
Яaffael1984 a la bonne réponse. Mais ce que vous essayez de faire doit être fait dans le contrôleur, pas dans la vue! Formatez votre tableau, puis donnez une image claire à la vue pour une meilleure lisibilité.
Vivien
6
Je suppose que cela dépend vraiment du contexte, ce qui a plus de sens, vous ne pensez pas?
entorse du

Réponses:

459

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

in est l'opérateur de confinement et définit un filtre qui renvoie les clés d'un tableau.

Raffael
la source
109
Si vous voulez obtenir la même chose que in_array () en PHP, ommettez le filtre des clés
Burgi
24
+ 1 Et aussi la négation est {% if item not in array %}et non {% if not _entry.id in array %}, donc c'est différent de cela {% if not var is null %}.
insertusernamehere
8
Vous pouvez également utiliser defined: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
le
90

Juste pour clarifier certaines choses ici. 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 que PHP in_array, utilisez l'expression suivante:

{% if myVar in myArray %}

Si vous voulez annuler cela, vous devez utiliser ceci:

{% if myVar not in myArray %}
Wim Mostmans
la source
1
Ces deux points semblent avoir été couverts par les commentaires sur la réponse acceptée en 2012. Cette réponse ne semble rien ajouter de plus.
William Isted
7
@William Isted cette réponse ajoute la bonne façon de faire du PHP in_array()en brindille.
elvismdev
2
@WilliamIsted Ensuite, cette réponse acceptée doit être modifiée pour être correcte.
user1032531
3
Il est préférable que les réponses données dans les commentaires soient transformées en réponses réelles, car les commentaires sont beaucoup plus susceptibles d'être supprimés.
Nathan Arthur
^ - supprimé ou simplement ignoré
Cid
16

Essaye ça

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

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 %}
Fumier
la source
0

Bien que les réponses ci-dessus soient correctes, j'ai trouvé quelque chose de plus convivial en utilisant l'opérateur ternaire.

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

Si quelqu'un a besoin de travailler pour foreach,

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