Obj::diff() 

\nn\t3::Obj()->diff($objA, $objB, $fieldsToIgnore = [], $fieldsToCompare = [], $options = [], $path = '', $diff = []); 

Compares two objects, returns array with differences. If a property of objA does not exist in objB, it is ignored.

// Returns array with differences
\nn\t3::Obj()->diff( $objA, $objB );

// ignores the fields uid and title
\nn\t3::Obj()->diff( $objA, $objB, ['uid', 'title'] );

// Compares ONLY the fields title and bodytext
\nn\t3::Obj()->diff( $objA, $objB, [], ['title', 'bodytext'] );

// Options
\nn\t3::Obj()->diff( $objA, $objB, [], [], ['ignoreWhitespaces'=>true, 'ignoreTags'=>true, 'ignoreEncoding'=>true] );
Copied!
@param mixed $objA An object, array or model
@param mixed $objB The object or model to be compared
@param array $fieldsToIgnore List of properties that can be ignored. Empty = none
@param array $fieldsToCompare List of properties to be compared. Empty = all
@param boolean $options Options / tolerances when comparing
includeMissing => also add missing properties in $objB
ignoreWhitespaces => ignore spaces
ignoreEncoding => ignore UTF8 / ISO encoding
ignoreTags => ignore HTML tags
depth => depth to be compared

| @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!