質問: 【対象言語とバージョン】 PHP5.3.6 Smarty2.6 【質問】 PHPの配列(Array)では、添え字は「文字列連結」して動的に 展開するのは一般的ですが、Smartyでは「`(バッククオート)」 を使いながら連結してもうまく行かなくて困っております。 【実現したいこと】 Smartyで使いたいのは下記例の1~3です ``` //<例> 1:$array['hoge'.$int] 2:$array['hoge'.$int.'hoe'] 3:if empty($array['hoge'.$int]) ``` ``` //【Smarty側でトライしたパターン】 上記1:$array.hoge`$int` =>エラーになる 同上記1:$array.hoge.$int =>エラーにならないがNULLで返される 同上記1:$array["hoge`$int`"] =>=>エラーになる 上記2:$array.hoge`$int`hoe =>エラーになる 同上記2:$array["hoge`$int`hoe"] =>エラーになる 上記3:{if empty($array.hoge`$int`||smarty:nodefaults)}~{/if} =>エラーになる ``` ``` 【そして現状Smartyで必ず出るエラー】 ・syntax error: unbalanced parenthesis in if statement ・syntax error: unrecognized tag: $array[hoge`$int`] ``` Smartyマニュアルを見渡してもさすがに、配列の添え字を連結しながら 展開させるところは見当たりませんでした。 もちろんassignで連結した文字列変数をそのまま配列添え字に使う方法も 考えております。 当方大量に配列が使われていますので、やはり文法上の問題と考えております。 Smarty内で配列の添え字を、動的にするのは無理がありますでしょうか? 無理ではなく可能であれば、ぜひ記述方法をお聞かせください。
回答: 文法的には期待する結合方法はないようなので、PHP 側で配列を再構成するのが望ましいでしょう。 どうしてもテンプレート内で処理するのであれば、言及されているように素直に assign で表現する形でよいかと思います。 ``` {assign var="hoge_int" value="hoge"|cat:$int}{$array.$hoge_int} ``` Smarty 3 であれば `{$hoge_int='hoge'|cat:$int}{$array.$hoge_int}` と省略できますね。 いずれにしろ、本来的には PHP 側で処理すべき内容かと思います。