Ranting: in_array atau kemungkinan serupa di dalam pernyataan if?

207

Saya menggunakan Twig sebagai mesin templating dan saya sangat menyukainya. Namun, sekarang saya telah menjalankan dalam situasi yang pasti harus dicapai dengan cara yang lebih sederhana daripada yang saya temukan.

Apa yang saya miliki sekarang adalah ini:

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

Apa yang saya cari adalah sesuatu yang lebih seperti ini:

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

Apakah ada cara untuk mencapai ini yang belum saya lihat?

Jika saya perlu membuat ekstensi saya sendiri, bagaimana saya bisa mengakses myVar dalam fungsi tes?

Terima kasih atas bantuan Anda!

keseleo
sumber
3
Яaffael1984 memiliki jawaban yang benar. Tetapi apa yang Anda coba lakukan harus dilakukan di controller, bukan di tampilan! Format array Anda dan kemudian berikan tampilan yang bersih untuk tampilan agar mudah dibaca.
Vivien
6
Saya kira itu benar-benar tergantung pada konteks jalan mana yang lebih masuk akal, bukan begitu?
keseleo

Jawaban:

459

Anda hanya perlu mengubah baris kedua dari blok kode kedua Anda dari

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

untuk

{% if myVar in someOtherArray|keys %}

in adalah operator kontainmen dan kunci filter yang mengembalikan kunci array.

Raffael
sumber
109
Jika Anda ingin mencapai yang sama dengan in_array () di PHP, ommit the keys filter
Burgi
24
+1 Dan negasinya adalah {% if item not in array %}dan tidak {% if not _entry.id in array %}, jadi ini berbeda dari ini {% if not var is null %}.
insertusernamehere
8
Anda juga dapat menggunakan definisi: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
ketat
90

Hanya untuk membersihkan beberapa hal di sini. Jawaban yang diterima tidak melakukan hal yang sama dengan PHP in_array .

Untuk melakukan hal yang sama dengan PHP in_array gunakan ekspresi berikut:

{% if myVar in myArray %}

Jika Anda ingin meniadakan ini, Anda harus menggunakan ini:

{% if myVar not in myArray %}
Wim Mostmans
sumber
1
Kedua poin ini tampaknya telah dicakup oleh komentar pada jawaban yang diterima pada tahun 2012. Jawaban ini tampaknya tidak menambah apa pun.
William Isted
7
@ William Isted jawaban ini menambahkan cara yang tepat untuk melakukan PHP in_array()di ranting.
elvismdev
2
@ WilliamIsted Maka jawaban yang diterima harus diedit menjadi benar.
user1032531
3
Lebih baik jawaban yang diberikan dalam komentar diubah menjadi jawaban yang sebenarnya, karena komentar cenderung dihapus.
Nathan Arthur
^ - dihapus atau diabaikan
Cid
16

Coba ini

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

Contoh lain mengikuti @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 %}
Kotoran
sumber
0

Meskipun jawaban di atas benar, saya menemukan sesuatu yang lebih ramah pengguna saat menggunakan operator ternary.

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

Jika seseorang perlu melakukan foreach maka,

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