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问题可以满足您的要求。它使用了反射方法

于 2013-05-07T13:09:32.630 回答