はちゅにっき

こっちのブログはまったり更新

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
それともやっぱりグローバルとして関数を定義しておくしかないのかなぁ。。。


もうやだこの仕様。
でも PHP かわいいよ。PHP
すきではないけれど。




「そもそも PHP にハッシュなんてねーよ」
はナシでお願いします。



「pgr そもそもそんな方法やらねーよ」
の場合は、もっと良い方法を教えていただけると嬉しいです。

*1:PHP 5.3 をのぞく

*2: そもそも PHP ではプログラム実行中に require するのは御法度らしいけど