Obj::diff()
\nn\t3::Obj()->diff($objA, $objB, $fieldsToIgnore = [], $fieldsToCompare = [], $options = [], $path = '', $diff = []);
Vergleicht zwei Objekte, gibt Array mit Unterschieden zurück. Existiert eine Property von objA nicht in objB, wird diese ignoriert.
// gibt Array mit Unterschieden zurück
\nn\t3::Obj()->diff( $objA, $objB );
// ignoriert die Felder uid und title
\nn\t3::Obj()->diff( $objA, $objB, ['uid', 'title'] );
// Vergleicht NUR die Felder title und bodytext
\nn\t3::Obj()->diff( $objA, $objB, [], ['title', 'bodytext'] );
// Optionen
\nn\t3::Obj()->diff( $objA, $objB, [], [], ['ignoreWhitespaces'=>true, 'ignoreTags'=>true, 'ignoreEncoding'=>true] );
Copied!
@param mixed $objA Ein Object, Array oder Model
@param mixed $objB Das zu vergleichende Object oder Model
@param array $fieldsToIgnore Liste der Properties, die ignoriert werden können. Leer = keine
@param array $fieldsToCompare Liste der Properties, die verglichen werden sollen. Leer = alle
@param boolean $options Optionen / Toleranzen beim Vergleichen
includeMissing => auch fehlende Properties in $objB hinzufügen
ignoreWhitespaces => Leerzeichen ignorieren
ignoreEncoding => UTF8 / ISO-Encoding ignorieren
ignoreTags => HTML-Tags ignorieren
depth => Tiefe, die verglichen werden soll
| @return array
Source Code
public function diff( $objA, $objB, $fieldsToIgnore = [], $fieldsToCompare = [], $options = [], $path = '', &$diff = [] )
{
$arrA = $this->toArray( $objA, $options['depth'] ?? 3 );
$arrB = $this->toArray( $objB, $options['depth'] ?? 3 );
$includeMissing = $options['includeMissing'] ?? false;
// Keine Felder zum Vergleich angegeben? Dann alle nehmen
if (!$fieldsToCompare) {
$fieldsToCompare = array_keys( $arrA );
}
// Felder, die ignoriert werden sollen abziehen.
$fieldsToCheck = array_diff( $fieldsToCompare, $fieldsToIgnore );
foreach ($fieldsToCheck as $k=>$fieldName) {
$deep = $path . ($path === '' ? '' : '.') . "{$fieldName}";
$hasDiff = false;
$valA = $arrA[$fieldName];
$valB = $arrB[$fieldName] ?? null;
// Property existiert nur in objA? Dann ignorieren
if (!$includeMissing && !isset($arrB[$fieldName])) continue;
if (is_array($valA)) {
$this->diff($valA, $valB, [], [], $options, $deep, $diff);
} else {
// Einfacher String-Vergleich
$cmpA = $valA;
$cmpB = $valB;
if (is_string($cmpA) && is_string($cmpB)) {
if ($options['ignoreWhitespaces'] ?? false) {
$cmpA = preg_replace('/[\s\t]/', '', $cmpA);
$cmpB = preg_replace('/[\s\t]/', '', $cmpB);
}
if ($options['ignoreTags'] ?? false) {
$cmpA = strip_tags($cmpA);
$cmpB = strip_tags($cmpB);
}
if ($options['ignoreEncoding'] ?? false) {
$cmpA = \nn\t3::Convert($cmpA)->toUTF8();
$cmpB = \nn\t3::Convert($cmpB)->toUTF8();
}
}
$hasDiff = $cmpA != $cmpB;
}
// Gab es einen Unterschied? Dann diff-Array befüllen
if ($hasDiff) {
$diff[$deep] = [
'from' => $valA,
'to' => $valB,
];
}
}
return $diff;
}
Copied!