次のような配列があるとします。
array(
[0] => function() { return "hello"; }
[1] => function() { return "world"; }
[2] => "look"
[3] => function() { return "and";}
[4] => function() { return "listen";}
)
2を呼び出さずに0、1、3、4を呼び出す方法はありますか?
匿名関数はClosure
クラスのインスタンスです。だからそれをチェックis_callable
して仕事をします。
foreach ($array as $func) {
if (is_callable($func) && $func instanceof Closure) {
$func();
}
}
Closure
実際には、無名関数を作成する以外にオブジェクトを手動でインスタンス化することはできないため、クラスチェックで十分です。
リフレクションを使用できます。これには、クロージャをチェックするためのドキュメント化されていない関数があります。これを試してください(テストされていません):
foreach ($array as $val) {
$re = newReflectionFunction($val);
if ($re->isClosure()) {
$val();
// do whatever you want
}
}
...または文字列/数値ではないかどうかを確認します。
foreach ($array as $val) {
if (!is_string($val) && !is_numeric($val)) {
$val();
// do whatever you want
}
}
...またはそれがオブジェクトであるかどうかを確認します。
foreach ($array as $val) {
if (gettype($val) == 'object') {
$val();
// do whatever you want
}
}
これがあなたの望むものだと思います。$result
各関数呼び出しの戻り値の配列になります(匿名関数でない場合を除きます。匿名関数の場合は、からの元の値になります$array
)。
$result = array_map(
function($e) {
return ($e instanceof Closure && is_callable($e)) ?
$e() : $e;
}, $array);
gettype
anonメソッドでは、「object」をis_callable()
返し、関数ではtrueを返します。その後、次のようになります。
foreach ($array as $val) {
if (is_callable($val) && gettype($val)=="object") {
$val();
}
}
これが私のテストコードです:
<?php
function look(){
return "looking";
}
$data=array(
0 => function() { return "hello"; },
1 => function() { return "world"; },
2 => "look",
3 => function() { return "and";},
4 => function() { return "listen";}
);
echo "<pre>";
foreach ($data as $val) {
if (is_callable($val) && gettype($val)=="object") {
echo $val();
}
}
?>