假设我有一个数组如下:
array(
[0] => function() { return "hello"; }
[1] => function() { return "world"; }
[2] => "look"
[3] => function() { return "and";}
[4] => function() { return "listen";}
)
有没有办法可以调用0,1,3和4而不调用2?
答案 0 :(得分:16)
匿名函数是Closure
类的实例。因此,检查并is_callable
完成工作。
foreach ($array as $func) {
if (is_callable($func) && $func instanceof Closure) {
$func();
}
}
实际上,类检查应该足够了,因为除非创建匿名函数,否则无法手动实例化Closure
个对象。
答案 1 :(得分:1)
您可以使用reflection,它有an undocument function to check for closures;试试这个(尚未测试):
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
}
}
答案 2 :(得分:1)
我认为这就是你想要的。 $result
将是每个函数调用的返回值的数组(除非它不是匿名函数,在这种情况下它将是来自$array
的原始值)。
$result = array_map(
function($e) {
return ($e instanceof Closure && is_callable($e)) ?
$e() : $e;
}, $array);
答案 3 :(得分:0)
gettype
返回“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();
}
}
?>