PHPのとりこです
久しぶりですが生きています。
gist が貼り付けられるかテストを兼ねて。
内容はすっごく簡単で、Perl の Hash::Rename を PHP にして、実現できないことを切り捨てただけです。
- Hash-Rename
- http://search.cpan.org/~marcel/Hash-Rename-0.01/
これで
<?php $rename = new HashRename( ); $hash = array( 'foo' => 'bar', 'hoge' => 'fuga', ); $args = array('foo' => 'foofoo'); $rename->hash_rename($hash, $args); // => $hash = array( 'foofoo' => 'bar', 'hoge' => 'fuga', )
こんなことになっちゃいます。
ほかにも
<?php $args = array( '__prepend' => '-', // 先頭に '-' を付与 '__append' => '@', // 末尾に '@' を付与 '__callback' => 'callback', // callback function を使う '__strict' => '!', // 変換した結果 key がぶつかったらしぬ );
などのオプションが使えるみたいです。組み合わせは自由自在で、上に書いた順番で評価していきます。
つまり、prepend して append した後の値が callback に渡され、キーの重複がチェックされます。
callback を指定する場合は
<?php function hogehoge ( ) { .... $args = array( '__callback' => array($this, 'callback_func') ); $rename->hash_rename($hash, $args); .... } function callback_func ($key) { return 'Bourbon'.$key.'House'; }
こんなふうにかくと、バーボンハウスしてくれます。
callback function は renmae 後の key を返してあげればいいだけですね。
本家の Perl みたいに、Code Reference を渡せると美しいと思うんですが、PHP だとそれができないので外部に関数を作るしかないみたいです。*1
ラムダ関数ってゆーのが PHP にもあるけれど、どうせグローバル領域を汚染するみたいだしね!
あと Perl だと関数を Export することができて、便利なんだけど、PHP って同じようなことができるのかな?
use / no みたいに、ある時点で require して、スコープを外れたら捨てられればそれでいいんですが。*2
それともやっぱりグローバルとして関数を定義しておくしかないのかなぁ。。。