Twigでループ処理を書きたいときに使う for は結構いろんな書き方ができるのでまとめとく。
とは言っても、ドキュメント見れば全部載ってるけども。
連続した値を扱いたいとき
https://twig.symfony.com/doc/2.x/tags/for.html#for
.. 演算子を使うと便利。
{% for i in 0..10 %}
{{ i }},
{% endfor %}
{# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, #}
{% for i in 'a'..'z' %}
{{ i }},
{% endfor %}
{# a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, #}
{% for i in 'a'|upper..'z'|upper %}
{{ i }},
{% endfor %}
{# A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, #}
ループ内で使える変数
https://twig.symfony.com/doc/2.x/tags/for.html#the-loop-variable
{% for i in '0'..'10' %}
{{ loop.index }}
{% endfor %}
{# 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, #}
{% for i in '0'..'10' %}
{{ loop.index0 }}
{% endfor %}
{# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, #}
{% for i in '0'..'10' %}
{{ loop.revindex }}
{% endfor %}
{# 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, #}
{% for i in '0'..'10' %}
{{ loop.revindex0 }}
{% endfor %}
{# 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, #}
{# 最初の要素のときだけtrue #}
{% for i in '0'..'10' %}
{{ loop.first }},
{% endfor %}
{# 1, , , , , , , , , , , #}
{# 最後の要素のときだけtrue #}
{% for i in '0'..'10' %}
{{ loop.last }},
{% endfor %}
{# , , , , , , , , , , 1, #}
{# 配列の長さを返す #}
{% for i in '0'..'10' %}
{{ loop.length }},
{% endfor %}
{# 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, #}
loop.parent はちょっとわかりづらい。
ループがネストしている場合に外側のループにアクセスできる。
{% for i in 0..3 %}
{% for j in 'a'..'c' %}
[{{ loop.parent.loop.index }}, {{ loop.index }}]<br>
{% endfor %}
{% endfor %}
{#
[1, 1]
[1, 2]
[1, 3]
[2, 1]
[2, 2]
[2, 3]
[3, 1]
[3, 2]
[3, 3]
[4, 1]
[4, 2]
[4, 3]
#}
条件を指定してループをまわす
https://twig.symfony.com/doc/2.x/tags/for.html#adding-a-condition
if を使うことで条件を指定できる。
{% for i in 0..10 if i % 2 == 0 %}
{{ i }},
{% endfor %}
{# 0, 2, 4, 6, 8, 10, #}
そのほかのおべんりなやつ
else を使うと空配列だったときの処理が書ける。
{% for i in [] %}
{{ i }}
{% else %}
empty!
{% endfor %}
{# empty! #}
キーを取得したいとき。
キーだけの取得もできるけど大抵は値とセットで欲しい。
{% for key in ['taro', 'ichiro', 'hanako']|keys %}
{{ key }}
{% endfor %}
{# 0 1 2 #}
{% for key, value in ['taro', 'ichiro', 'hanako'] %}
{{ key }}:{{ value }}
{% endfor %}
{# 0:taro 1:ichiro 2:hanako #}
slice とかと組み合わせたり。
{% for key, value in ['太郎', '次郎', '三郎', '四郎', '五郎']|slice(2, 4) %}
{{ key }}:{{ value }}
{% endfor %}
{# 0:三郎 1:四郎 2:五郎 #}
ざっとまとめたけど色々できるな。。