ループネスト

PHP

$obj->arr = array(array('var1' => 'a',
                         'var2' => 'b'),
                  array('var1' => 'aa',
                        'var2' => 'bb',
                        'nest' => array(array('nest1' => 'nestA',
                                              'nest2' => 'nestB',
                                              'var2' => 'nestC'),
                                        array('nest1' => 'nestAA',
                                              'nest2' => 'nestBB',
                                              'var3'  => 'nestCC'))),
                  array('var3' => 'cc'),
                  array('nest' => array(array('var1' => 'nestAAA')))
                  );
$obj->var3 = 'test';

HTMLテンプレート

{var3} (上位階層)<br>
<table border>
<tr>
  <th>var1</th><th>var2</th><th>var3</th><th>nest</th>
</tr>
{loop:arr}
<tr>
<td>{var1}</td><td>{var2}</td><td>{var3}</td>

<td>
{loop:nest}
nest1={nest1} nest2={nest2} var1={var1} var2={var2} var3={var3}<br>
{endloop:}
</td>

</tr>
{endloop:}
</table>

{var3} (loop中に書き換えた変数が元に戻っているかどうか)


表示

test (上位階層)
var1var2var3nest
abtest
aabbtest nest1=nestA nest2=nestB var1=aa var2=nestC var3=test
nest1=nestAA nest2=nestBB var1=aa var2=bb var3=nestCC
cc
test nest1= nest2= var1=nestAAA var2= var3=test
test (loop中に書き換えた変数が元に戻っているかどうか)


完成!したかも。



単純に考えてそれぞれforeach文1回分、つまり2倍の時間がかかってしまうわけだけれど、HTMLにforeachとかいうプログラムが入り込まなくて自分が使うには(テンプレートの書き方説明するには)良い感じになった。



やったことと言えば

  • Compiler/Flexy.php に toStringLoop関数とtoStringEndLoop関数の追加
  • Tokenizer.lex から{loop:{FLEXY_VAR}}と{endloop:}を認識するようにしたTokenizer.phpの生成
  • Token/Loop.php と Token/EndLoop.php の作成

です。
他に使う人が居るかどうかは謎だけれどもしばらく使って問題がなければどこかにアップしよう。
PHPライセンスって確か改造後の公開もいいんだよね…)