Проверьте, содержит ли массив объектов второй массив объектов

Мне нужно проверить, если массив 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...

Каков был бы правильный способ справиться с этим?

2 ответа

Решение

Я сделал это, что, кажется, работает, в качестве примера я заполнил оба массива всеми видами объектов и типов, просто чтобы посмотреть, работает ли он:

$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;
}

Как я уже писал, вот альтернативное решение. Решение Тима, на мой взгляд, более читабельно.

//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;
}
Другие вопросы по тегам