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