0

我需要检查一个对象数组是否DOMNode包含类似DOMNode对象数组中的所有项目。

一般来说,为了检查一个数组是否包含另一个数组,我尝试了这个问题中列出的一些方法。但是,两者都array_intersect()array_diff()比较基数上的数组项-因为它们无法转换为字符串,所以会(string) $elem1 === (string) $elem2引发以下错误。DOMElements

PHP Catchable fatal error: 
Object of class DOMElement could not be converted to string in...

处理这个的正确方法是什么?

4

2 回答 2

1

我已经做到了这似乎可行,例如,我用各种对象和类型填充了两个数组,只是为了看看它是否有效:

$array = array(new DOMDocument(), 'foobar', 112312, new DateTime('Y'));
$array2 = array(new DOMDocument(), 'foobar',12312, false, new DateTime('Y'), 112312, true);

var_dump(array_diff_two($array,$array2)); //returns true

$array = array(new DOMDocument(), 'foobar', 112312, new DateTime('m'));
$array2 = array(new DOMDocument(), 'lorem ipsum!',12312, false, new DateTime('Y'), 112312, true);

var_dump(array_diff_two($array,$array2)); //returns false

function array_diff_two($array1, $array2){
    // serialize all values from array 2 which we will check if they contain values from array 1
    $serialized2 = array();
    foreach ($array2 as $value){
        $serialized2[] = serialize($value);
    }

    // Check if all values from array 1 are in 2, return false if it's not found
    foreach ($array1 as $value) {
        if (! in_array(serialize($value), $serialized2)) {
            return false;
        }
    }
    return true;
}
于 2014-05-09T14:01:54.523 回答
1

正如我现在写的那样,这是一个替代解决方案。在我看来,蒂姆的解决方案更具可读性。

//Does array of DOMNodes contain other array DOMNodes
private function array_contains_array($haystack,$needle){
    //Create object hash array of $haystack
    $haystackHashArr = array();
    foreach ($haystack as $idx => $haystackObj) {
        $haystackHashArr[$idx] = spl_object_hash($haystackObj);
    }

    //Now search for hashes of needle array objects in Haystack-hash-Array
    foreach ($needle as $domNode) {
        $huntedForHash = spl_object_hash($domNode);
        foreach($haystackHashArr as $hsHash){
            if ($hsHash == $huntedForHash) continue 2;
        }
        //Only get here if an item not found (Due to continue statement)
        return false;
    }
    return true;
}
于 2014-05-09T14:17:00.697 回答