「WordPressで学ぶPHP(1)変数・制御構造編」が発売されました。
「WordPressで学ぶPHP」シリーズの第1巻で、WordPressを通してPHPを学んでいく本です。
この本では、PHPの基本となる変数と制御構造について解説します。
Kindle本で、定価500円です。
テンプレートでの繰り返しのスキップ
先日、Twitterで@riatwさんが以下のようなツイートをしていました。
MTだけではないけれど、For文の途中で特定の条件になったときに次の周をスキップしたいときとかってどうすればいいんだろう。
Movable Typeのテンプレートタグには、繰り返しをスキップするタグはありません。
したがって、条件判断をうまく使って、繰り返しをスキップさせるしかありません。
その方法を紹介します。
1.現在の繰り返しの残りをスキップ
まず、「繰り返しの途中で条件を判断して、条件が成立していれば、繰り返しのその周の残りの処理をスキップして、次の周に進みたい」ということから考えてみます。
多くのプログラム言語には、繰り返しのその周の残りの処理をスキップする命令があります。
例えば、Perlならnextですし、PHPやJavaScriptならcontinueです。
しかし、前述したように、Movable Typeのテンプレートタグにはnextやcontinueにあたるものがありません。
ただ、「条件が成立していなければ、繰り返しの残りの部分を実行する」と考え方を置き換えて、MTUnlessタグで表すことができます。
実際にMTUnlessタグを使ってテンプレートを書くと、以下のようになります。
<mt:Forなど> ・ ・(繰り返し前半) ・ <mt:Unless 条件> ・ ・(繰り返し後半) ・ </mt:Unless> </mt:Forなど>
2.繰り返しの次の周をスキップ
「繰り返しのその周をスキップ」は比較的簡単ですが、「次の周をスキップ」はやや複雑です。
まず、「次の周をスキップする」ということを表すために、何らかの変数を使います。
条件を満たした時には、繰り返しの最後で、その変数の値を1にしてフラグを立てます。
そして、繰り返しの先頭で、変数の値が1かどうかを判断します。
もし、値が1である場合、前の周の最後で、「次の周をスキップする」というフラグを立てたしたことになります。
そこで、その周の処理を飛ばします。
さらに、処理を飛ばした後、変数の値を0にして、「次の周をスキップする」というフラグを下すことが必要です。
変数の名前を「skip」にするとすれば、上記の処理をテンプレートで表すと以下のようになります。
<mt:Forなど> <mt:Unless name="skip"> 繰り返したい処理 </mt:Unless> <$mt:SetVar name="skip" value="0"> <mt:If 条件> <$mt:SetVar name="skip" value="1"> </mt:If> </mt:Forなど>
3.ところで・・・
これまでのプログラミングの経験で、「条件が成立していれば、繰り返しのその周の残りの処理をスキップ」ということはよくありました。
ただ、「条件が成立していれば、繰り返しの次の周の処理をスキップ」ということは、ほとんどなかったように思います。
@riatwさんが直面した事例を知りたいです。