Проверьте, содержит ли массив объектов второй массив объектов
Мне нужно проверить, если массив 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;
}