🐈

【PHP】 twigの文法(三項演算子, for, loop, index, key, value, if, ゼロ埋め, 空null判定,

2021/03/07に公開

昔にまとめたやつを供養。

三項目演算子

{{ foo ? 'yes' : 'no' }}

ちなみに
公式ドキュメントを読むと以下のように記載がされています。

{{ foo ? 'yes' : 'no' }}
{{ foo ?: 'no' }} is the same as {{ foo ? foo : 'no' }}
{{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}

twigでforループの回数(index)を取得する方法

基本的には loop.indexというのを使用します。

そのほかにも便利なものがありますが、以下の通りです。

loop.index ループした回数(1から始まる)
loop.index0 ループした回数(0から始まる)
loop.revindex ループした回数(最後からカウント、1から始まる)
loop.revindex0 ループした回数(最後からカウント、0から始まる)
loop.first 最初の要素のときtrueを返す
loop.last 最後の要素のときtrueを返す
loop.length 配列の長さを返す
loop.parent ネストしてるループのとき、上階層のループ要素を取得

twigでFizzBuzzを解く

では、FizzBuzz問題をtwigで書いてみます。通常、以下の通りのようになります。

{% for i in range(1, 100) %}
{% if i % 15 == 0 %} FizzBuzz
{% elseif i % 5 == 0 %} Buzz
{% elseif i % 3 == 0 %} Fizz
{% else %} {{ i }}
{% endif %}
{% endfor %}


//loop.indexを使うとこうなる。
{% for i in range(1, 100) %}
{% if loop.index % 15 == 0 %} FizzBuzz
{% elseif loop.index % 5 == 0 %} Buzz
{% elseif loop.index % 3 == 0 %} Fizz
{% else %} {{ loop.index }}
{% endif %}
{% endfor %}

ちなみに
range(1, 100) : 1から100までの数値が入った配列が出来ます。

これらの数値に対して、forループで取り出して、ひたすら条件分岐するだけです。

なお、 数値の配列の場合、

{% for i in range(1, 100) %}{% for i in 1..100%} は同じ意味になります。

あと、twigには「数値が割り切れるかどうか」を判定する関数があります。

好きな人はこちらの divisible by (意味:~で割り切れる)を使うのも良いでしょう。

{% if loop.index is divisible by(3) %}
Buzz
{% endif %}

twigで key, valueを取得する方法

こんな感じです。

{% for key, value in usernames %}
{{ key }}{{ usernames.value }}
{% endfor %}

Twigでゼロ埋めする方法

こんな感じ
loop.indexで取得した数字をゼロ埋めして表示する例です。

{{ '%02s'|format(loop.index) }}

解説:
%02s:桁数を指定します。%02sだと2桁です。3桁の場合は%03sですね。

|format(loop.index):formatフィルタを使用します。使いたい数字を引数として指定します。

Twigで空判定とnull判定をする

// 空判定 hogehogeという変数自体が定義されていない場合はErrorになる
{% if hogehoge %}...{%  endif %}

// Errorにしたくない場合
{% if hogehoge is defined %}...{% endif %}

// null判定
{% if hogehoge is null %}...{% endif %}

// twigで空文字かつnull判定する
{% if hogehoge is empty %}...{% endif %}

Twigで正規表現(preg_match)の判定する

twigでも正規表現使えるのかな?と思ったので調べてみました。

(そもそもTwigに正規表現を書く時点でオカシイよね?Model層で処理するべきだよね?という指摘はスルーします)

Twigで正規表現を書くとこんな感じ

{% set SAMPLE_STRING = "apple"
{% if SAMPLE_STRING matches '{^.*ap.*' %}
MATCH
{% else %}
DON'T MATCH
{% endif %}

「match」じゃありません。「matches」です。正規表現を表す関数です。

'{    }'の括弧が大事です。これが無いと、ただの文字列と見なされます。

Twigでキーの存在チェック

PHPでいうところのarray_key_existsに相当します。こちらのも変数の時と同じで definedを使えばOKです。キーが無ければnullを返します。

{% if list.key is defined %}
hogehoge
{% endif %}

TWIGで配列の重複を削除

関数はないので一工夫する必要があるようです。

以下に配列の重複を削除するコードを載せました。

{% set resultArr = [] %}
{% for name in array %}
{% if name not in resultArr %}
{% set resultArr = resultArr|merge([name]) %}
{% endif %}
{% endfor %}

ソースの解説
基本的なアルゴリズムの流れは以下の通りです。

1、削除後の結果を入れる配列($resultArr)を用意
2、元の配列($array)から値を一つずつ取り出す。
3、resultArrの中の値と一致しなければ、resultArrに格納する。
以上を元の配列の要素の数だけ繰り返す。

twigのjoin

{% set arr = [1,2,3] %}
{{ arr | join("/") }}

引数に空文字を設定すると、要素のみが結合されます。

以上、長々とありがとうございました。

Discussion