PHPの「array_walk」や「array_map」といった関数は、指定したユーザー定義関数の引数としてある配列の要素を順に与えて実行する事ができる便利そうな関数です。
使い道としては配列の要素全てにtrimをかけるとかでしょうか?なにせ配列全てをループでまわして処理する手間がかかりません。
というかPHPではそういった処理がメンドイわけでorz
で、さっそくこれを利用しようとして、見事にはまりました。
なにかといえば、例えば
class foo {
function bar() {
$tmp = $list;
$list = array_map("hoge", $tmp);
}
// コールバック関数
function hoge($item) {
return trim($item);
}
}
なんて感じで書くとitemって配列の要素全てにtrimがかかるはずなんですけど、これがエラーになって「そんな関数ねぇー」みたいに怒られます。
実はhoge関数ではなくtrim関数を指定するとエラーにはなりません。PHP関数は指定できないみたいなのですが、じゃあTrim関数ってなんなの?って感じ。まあ調べませんが。
んで2時間ほど悩み、風呂に入って飯を食った後ふと気が付きました。
「クラス内で定義してる関数だからか?」
さっそくコールバック関数をクラス外に置き実行してみると・・・
通りました!!!はぁぁorz
なんだかJavascriptでも同じような問題ではまった記憶が・・・まぁいいやw
んで問題が判明したのでそれらあたりの情報を探すとあっさりと見つかりました。
ぐさぎ どっと こむ : コールバック関数 by gusagi - ぐさぎ どっと こむ
コールバック関数を、オブジェクトと関数名の配列で引き渡す。
これ、PHPのマニュアルにも書いてあったんですが、知りませんでした
まさにこれ。マニュアルみてないなぁ。
んで動作させるための参考例。とはいえこのままでは動きません。
class foo {
function bar() {
$tmp = $list;
$list = array_map(array(&$this, "hoge"), $tmp);
}
// コールバック関数
function hoge($item) {
return trim($item);
}
}
クラス外においてもいいんだけど気持ち悪いので、関数指定を変更。
これはきっと罠だな。
投稿日時 : 2006年10月22日 1:17