<?php
/**
* Diffs two datasets of DOM elements, highlighting differences.
*
* @param array $dataset1 The first dataset of DOM elements.
* @param array $dataset2 The second dataset of DOM elements.
* @param array $defaultValues An associative array of default values for attributes.
* @return array An array of differences, where each element is an array
* containing the element, the attribute with the difference,
* and the old and new values. Returns an empty array if no differences.
*/
function diffDOMDatasets(array $dataset1, array $dataset2, array $defaultValues): array
{
$diffs = [];
if (empty($dataset1) && empty($dataset2)) {
return $diffs; // Both datasets are empty, no differences
}
if (empty($dataset1)) {
// Dataset 1 is empty, all elements in dataset 2 are added
foreach ($dataset2 as $element) {
$diffs[] = array(
'element' => $element,
'attribute' => null, // No specific attribute difference, just addition.
'old_value' => null,
'new_value' => null
);
}
return $diffs;
}
if (empty($dataset2)) {
// Dataset 2 is empty, all elements in dataset 1 are removed
foreach ($dataset1 as $element) {
$diffs[] = array(
'element' => $element,
'attribute' => null, // No specific attribute difference, just removal.
'old_value' => null,
'new_value' => null
);
}
return $diffs;
}
// Create a map of element IDs to elements for faster lookup
$dataset1Map = [];
foreach ($dataset1 as $element) {
$dataset1Map[$element->id] = $element;
}
$dataset2Map = [];
foreach ($dataset2 as $element) {
$dataset2Map[$element->id] = $element;
}
// Find elements present in both datasets
$commonElements = array_intersect_key($dataset1Map, $dataset2Map);
foreach ($commonElements as $elementId => $element1) {
$element2 = $dataset2Map[$elementId];
// Iterate through attributes and check for differences
foreach ($defaultValues as $attribute => $defaultValue) {
$value1 = $element1->getAttribute($attribute);
$value2 = $element2->getAttribute($attribute);
if ($value1 !== $value2) {
$diffs[] = array(
'element' => $element1,
'attribute' => $attribute,
'old_value' => $value1,
'new_value' => $value2
);
}
// Handle attributes that don't exist in the default values.
// This ensures that attributes present in the DOM but not
// specified in defaultValues are also flagged.
if ($element1->hasAttribute($attribute) && !$element2->hasAttribute($attribute)) {
$diffs[] = array(
'element' => $element1,
'attribute' => $attribute,
'old_value' => $element1->getAttribute($attribute),
'new_value' => null
);
}
if (!$element1->hasAttribute($attribute) && $element2->hasAttribute($attribute)) {
$diffs[] = array(
'element' => $element1,
'attribute' => $attribute,
'old_value' => null,
'new_value' => $element2->getAttribute($attribute)
);
}
}
}
return $diffs;
}
?>
Add your comment