【PHP】 twigの文法(三項演算子, for, loop, index, key, value, if, ゼロ埋め, 空null判定,
昔にまとめたやつを供養。
三項目演算子
{{ 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、
以上を元の配列の要素の数だけ繰り返す。
twigのjoin
{% set arr = [1,2,3] %}
{{ arr | join("/") }}
引数に空文字を設定すると、要素のみが結合されます。
以上、長々とありがとうございました。
Discussion