So stellst du Unterschiede zwischen 2 Mehrdimensionalen Arrays fest

Ich habe schon länger nach einer Möglichkeit gesucht Mehrdimensionale Arrays in PHP auf Unterschiede zu prüfen. Leider bin ich nie richtig fündig geworden.

Deshalb habe ich meinen eigenen PHP-Code programmiert, um zwei Arrays miteinander zu vergleichen, den ich gerne mit meinen Lesern teilen möchte.

array_multi_diff für deinen PHP-Code

function array_multi_diff( $array1, $array2 ) {

	$result = array();
	foreach( $array1 as $key => $a1 ) {

		if( !array_key_exists( $key, $array2 ) ) {

			$result[ $key ] = $a1;
			continue;

		}

		$a2 = $array2[ $key ];

		if( is_array( $a1 ) ) {

			$recc_array = array_multi_diff( $a1, $a2 );
			if( !empty( $recc_array ) ) {

				$result[ $key ] = $recc_array;

			}

		}
		else if( $a1 != $a2 ) {

			$result[ $key ] = $a1;

		}

	}
	return $result;

}

Verwendung der PHP-Funktion

Diese Funktion ist rekursiv. Das bedeutet, dass sie sich selbst wiederholt aufruft. Dieser Fall tritt ein, wenn ein Wert eines Array-Items selbst eine Array ist.

Sollte der Wert keine Array sein, wird er in eine "result"-Array eingetragen und an die Ebene weiter nach oben gegeben.

Solltest du dich nicht mit der Rekursion auskennen empfehle ich dir den Beitrag Rekursive Programmierung von webmasterpro.de anzusehen. Der Beitrag bringt dir anhand einer Berechnung der Fakultät die Rekursion sehr einfach bei.

Übergebe deine beiden mehrdimensionalen Arrays in den beiden Parametern der Funktion.

Du erhältst die Werte, die in der Array 1, aber nicht in der Array 2 vorkommen.

Um herauszufinden, ob die Array 2 Werte besitzt, die in der Array 1 nicht vorkommen, kannst du die Werte einfach tauschen.

Sollten beide Arrays die gleichen Werte haben, gibt die Funktion eine Leere Array zurück.

Beispiele für das Multimensionale array_diff

Nachfolgend findest du ein paar Beispiele für die Verwendung der Funktion mit der Ausgabe, die du aus der Funktion erhältst.

Ein einfacher Wert unterscheidet sich

In diesem Beispiel unterscheidet sich nur die ID in den beiden Arrays. Als Ergebnis erhältst du eine Array mit dem Wert "id" der ersten Array.

$array1 = array(
	'id'			=> 1,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

$array2 = array(
	'id'	=> 2,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

var_dump( array_multi_diff( $array1, $array2 ) );

Ergebnis:

array(
	'id'			=> 1
);

Mehrere Werte in Arrays unterscheiden sich

In diesem Beispiel unterscheiden sich die beiden Arrays mehr als im ersten Beispiel, da der Name und die Adresse unterschiedlich ist. Die Postleitzahl unterscheidet sich nicht, weshalb diese nicht im Ergebnis aufgeführt wird.

$array1 = array(
	'id'			=> 1,
	'properties'	=> array(
		'name'			=> 'Max Muster',
		'address'		=> array(
			'street'		=> 'Fakestreet 2',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

$array2 = array(
	'id'	=> 1,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

var_dump( array_multi_diff( $array1, $array2 ) );

Ergebnis:

array(
	'properties'	=> array(
		'name'			=> 'Max Muster',
		'address'		=> array(
			'street'		=> 'Fakestreet 2'
		)
	)
);

Es gibt keinen Unterschied zwischen den beiden Arrays

Im nächsten Beispiel unterscheiden sich die Arrays nicht. Jedes Feld und der Aufbau sind komplett identisch. Deshalb wird eine leere Array zurückgegeben.

$array1 = array(
	'id'	=> 1,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

$array2 = array(
	'id'	=> 1,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

var_dump( array_multi_diff( $array1, $array2 ) );

Ergebnis:

array();

Die beiden Arrays besitzen unterschiedliche Schlüssel

Das letzte Beispiel zeigt was geschieht, wenn in einem der beiden Arrays ein kompletter Block fehlt, aber alle anderen Werte identisch sind.

$array1 = array(
	'id'	=> 1,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		)
	),
	'gender'		=> 'male'
);

$array2 = array(
	'id'	=> 1,
	'properties'	=> array(
		'name'			=> 'John Doe',
		'address'		=> array(
			'street'		=> 'Fakestreet 1',
			'zip'			=> 12345
		),So vergleichst du 2 Mehrdimensionale Arrays miteinander und stellst alle Unterschiede fest.
		'products'		=> array(
			'1'				=> 'Product 1',
			'2'				=> 'Product 2'
		)
	),
	'gender'		=> 'male'
);

var_dump( array_multi_diff( $array1, $array2 ) );

Ergebnis:

array(
	'properties'	=> array(
		'products'		=> array(
			'1'				=> 'Product 1',
			'2'				=> 'Product 2'
		)
	)
);

Fazit

Dieser kleine Code-Schnipsel kann dir helfen die Unterschiede von 2 Arrays festzustellen. Dadurch kannst du zum Beispiel Duplikate herausfinden, die du sonst nur mit sehr aufwändigem Code feststellen kannst.

Schreibe gerne einen Kommentar, falls du mitteilen möchtest wie du diese Funktion anwendest.

 

Codepalm
PHP Array_Diff für Multidimensionale Arrays