<?php
/**
* Deduplicates DOM elements within a given DOM node.
*
* @param DOMNode $node The DOM node to process.
* @param bool $strict Whether to perform a strict comparison (===). Defaults to true.
* @param bool $recursive Whether to process child nodes recursively. Defaults to true.
* @return DOMNode The modified DOM node.
*/
function deduplicateDOMElements(DOMNode $node, bool $strict = true, bool $recursive = true): DOMNode
{
if (!$node instanceof DOMNode) {
return $node; // or throw an exception
}
if ($recursive) {
foreach ($node->childNodes as $child) {
$node = deduplicateDOMElements($child, $strict, $recursive);
}
}
$elements = [];
$newChildren = [];
foreach ($node->childNodes as $child) {
if ($child instanceof Element) {
$isDuplicate = false;
foreach ($elements as $element) {
if ($strict) {
if ($element === $child) {
$isDuplicate = true;
break;
}
} else {
//Loose comparison
if ($element == $child) {
$isDuplicate = true;
break;
}
}
}
if (!$isDuplicate) {
$elements[] = $child;
$newChildren[] = $child;
}
} else {
$newChildren[] = $child; // Keep non-element nodes
}
}
$node->appendChild($Document->createElement('fragment')); // Create a fragment to hold the new children
$fragment = $node->firstChild;
foreach ($newChildren as $child) {
$fragment->appendChild($child);
}
return $node;
}
//Example Usage
/*
$Document = new DOMDocument();
$element = $Document->createElement('div');
$element->appendChild($Document->createElement('p'));
$element->appendChild($Document->createElement('p'));
$element->appendChild($Document->createElement('span'));
$element->appendChild($Document->createElement('span'));
$node = $Document->appendChild($element);
$deduplicatedNode = deduplicateDOMElements($node);
echo $deduplicatedNode->outerHTML;
*/
?>
Add your comment