13

次のような配列があるとします。

array(
    [0] => function() { return "hello"; }
    [1] => function() { return "world"; }
    [2] => "look"
    [3] => function() { return "and";}
    [4] => function() { return "listen";}
)

2を呼び出さずに0、1、3、4を呼び出す方法はありますか?

4

4 に答える 4

16

匿名関数はClosureクラスのインスタンスです。だからそれをチェックis_callableして仕事をします。

foreach ($array as $func) {
    if (is_callable($func) && $func instanceof Closure) {
        $func();
    }
}

Closure実際には、無名関数を作成する以外にオブジェクトを手動でインスタンス化することはできないため、クラスチェックで十分です。

于 2012-06-02T11:40:30.057 に答える
1

リフレクションを使用できます。これには、クロージャをチェックするためのドキュメント化されていない関数があります。これを試してください(テストされていません):

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
    }
}
于 2012-06-02T11:33:46.807 に答える
1

これがあなたの望むものだと思います。$result各関数呼び出しの戻り値の配列になります(匿名関数でない場合を除きます。匿名関数の場合は、からの元の値になります$array)。

$result = array_map(
                    function($e) {
                      return ($e instanceof Closure && is_callable($e)) ?
                        $e() : $e;
                    }, $array);
于 2012-06-02T11:43:06.237 に答える
0

gettypeanonメソッドでは、「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();
    }
}

?>
于 2012-06-02T11:36:03.550 に答える