モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

CakePHPでbakeしたものをtwig表記に変換する(あるいはtwigでハッシュと配列が混在した値の表現方法)

CakePHPでbakeすると、hashの中にkey-valueになっていない、値がそのまま入ってるようなarray()が書かれています。
例えばこんなやつです。

array('action' => 'delete', $user['User']['id'])

PHPの変態arrayでは、このようにハッシュと配列が混在したarray()(arrayは普通「配列」でしょうが、そう書くとなにがなんだかわからなくなるので「PHPのarray()で作られるもの」を指して「array()」と表記することにします)を作ることができるのです。


twigでは、

  • ハッシュの場合
{ 'test1':'hoge', 'test2':'aho' }
  • 配列の場合
[ 'aaa', 'bbb' ]

というように表現できるのですが、array()で書けるようなハッシュと配列が混在したものを表現することは出来ません。


ではどうしたら良いだろう… とだいぶ悩んでいろいろ試したりぐぐったりしていました。
そこで、PHPがハッシュと配列混在しているarray()をどう内部表現しているのか、確認してみました。

array('test1'=>'hoge', 'aaa', 'test2'=>'aho', 'bbb')

これをprint_rで表示してみると…

array(
	'test1' => 'hoge',
	(int) 0 => 'aaa',
	'test2' => 'aho',
	(int) 1 => 'bbb'
)

こんなようになっていました。

つまり、配列は勝手に添字を付けられて、ハッシュとして保持されているのですね。
なので、ハッシュではなく値がそのまま出てきた時には、順番に0,1,2,…と添字を振ってやってハッシュにしてやれば良いようです。


なので、例えばCakePHPでbakeが焼いた下記のコードをTwigViewでの表記に変換すると

echo $this->bootstrapForm->postLink(
    __('Delete'),
    array('action' => 'delete', $user['User']['id']),
    null,
    __('Are you sure you want to delete # %s?', $user['User']['id']));
  • twig
{{ bootstrapForm.postLink(
    'Delete' | trans,
    {'action':'delete', 0:user.User.id},
    null,
    'Are you sure you want to delete #' ~ user.User.id ~ '?' | trans) }}

とういように表現することが出来ます。


ハッシュの中で値だけが書かれている

array('action' => 'delete', $user['User']['id'])

の部分に添字「0」でハッシュにしてやり

{'action':'delete', 0:user.User.id}

に変えるところがミソ… というか、まさにバッドノウハウですね。