Ramoscello: in_array o simili possibili all'interno dell'istruzione if?


207

Sto usando Twig come motore di template e lo adoro davvero. Tuttavia, ora ho corso in una situazione che sicuramente deve essere realizzabile in un modo più semplice di quello che ho trovato.

Quello che ho adesso è questo:

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

Quello che sto cercando è qualcosa di più simile a questo:

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

C'è un modo per ottenere ciò che non ho ancora visto?

Se devo creare la mia estensione, come posso accedere a myVar nella funzione test?

Grazie per l'aiuto!


3
Яaffael1984 ha la risposta giusta. Ma quello che stai cercando di fare dovrebbe essere fatto nel controller, non nella vista! Formatta il tuo array e dai un aspetto pulito alla vista per la migliore leggibilità.
Vivien,

6
Suppongo che dipenda davvero dal contesto in che modo ha più senso, non credi?
distorsione

Risposte:


459

Devi solo cambiare la seconda riga del tuo secondo blocco di codice da

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

per

{% if myVar in someOtherArray|keys %}

in è l'operatore di contenimento e chiavi un filtro che restituisce le chiavi di una matrice.


109
Se vuoi ottenere lo stesso di in_array () in PHP, premi il filtro tasti
Burgi

24
+ 1 E anche la negazione è {% if item not in array %}e non {% if not _entry.id in array %}, quindi è diversa da questa {% if not var is null %}.
inserireusernamehere il

8
Puoi anche usare definito: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
stretto il

90

Solo per chiarire alcune cose qui. La risposta accettata non fa lo stesso di PHP in_array .

Per fare lo stesso di PHP in_array usa la seguente espressione:

{% if myVar in myArray %}

Se vuoi negarlo, dovresti usare questo:

{% if myVar not in myArray %}

1
Questi due punti sembrano essere stati coperti dai commenti sulla risposta accettata nel 2012. Questa risposta non sembra aggiungere altro.
William Isted,

7
@William Isted questa risposta aggiunge il modo giusto di fare PHP in_array()in ramoscello.
elvismdev

2
@WilliamIsted Quindi quella risposta accettata dovrebbe essere modificata per essere corretta.
user1032531

3
È meglio che le risposte fornite nei commenti vengano trasformate in risposte effettive, poiché è molto più probabile che i commenti vengano eliminati.
Nathan Arthur,

^ - cancellato o semplicemente ignorato
Cid


10

un altro esempio che segue @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

Sebbene le risposte di cui sopra siano giuste, ho trovato qualcosa di più user-friendly approccio durante l'utilizzo dell'operatore ternario.

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

Se qualcuno ha bisogno di lavorare su foreach allora,

{% for attachment in attachments %}
    {{ attachment in item['Attachments'][0] ? 'y' : 'n' }}
{% endfor %}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.