1

私はこのような機能を持っています:

// merge - merge two or more given trees and returns the resulting tree
function merge() {
    if ($arguments = func_get_args()) {
        $count = func_num_args();

        // and here goes the tricky part... :P
    }
}

のような関数を使用して、指定されたすべての引数が同じ型/クラス (この場合はクラス) に属しているかどうかを確認できますがget_class()、それは (私が理解している限りでは) 単一の要素レベルで動作します。is_*()ctype_*()

私が理想的にやりたいことは、in_array()関数に似ていますが、配列内のすべての要素のクラスを比較することですin_class($class, $arguments, true).

私はこのようなことができます:

$check = true;

foreach ($arguments as $argument) {
    $check &= (get_class($argument) === "Helpers\\Structures\\Tree\\Root" ? true : false);
}

if ($check) {
    // continue with the function execution
}

だから私の質問は...これに定義された関数はありますか? または、少なくとも、これを達成するためのより優れた/よりエレガントな方法はありますか?

4

2 に答える 2

1

array_reduce(...)すべての要素に関数を適用するために使用できます。あなたの目標がワンライナーを書くことであるなら、あなたも使うことができますcreate_function(...)

array_reduce の例

<?php
    class foo { }
    class bar { }

    $dataA = array(new foo(), new foo(), new foo());
    $dataB = array(new foo(), new foo(), new bar());

    $resA = array_reduce($dataA, create_function('$a,$b', 'return $a && (get_class($b) === "foo");'), true);
    $resB = array_reduce($dataB, create_function('$a,$b', 'return $a && (get_class($b) === "foo");'), true);

    print($resA ? 'true' : 'false'); // true
    print($resB ? 'true' : 'false'); // false, due to the third element bar.
?>
于 2013-05-07T12:59:00.190 に答える
0

このSOの質問はあなたの要件に合うと思います。ReflectionMethodを使用しています

于 2013-05-07T13:09:32.630 に答える