2 Arrays vergleichen und unterschied anzeigen

dreambaser

Erfahrenes Mitglied
Hallo Leute,

ich brauch mal eure Hilfe in Sachen Arrays.
Ich habe 2 Arrays, die unterschiedliche Inhalte haben können. Aus diesen werden bestimmte Sachen berechnet.

Hier mal ein Beispiel wie die Arrays aufgebaut sind.

PHP:
array(1) {
  ["hm-bio"]=>
  array(3) {
    [0]=>
    array(1) {
      ["BIO"]=>
      array(7) {
        ["start"]=>
        string(10) "01.01.2007"
        ["end"]=>
        string(10) "31.12.2007"
        ["toon"]=>
        string(3) "240"
        ["mgb"]=>
        string(1) "1"
        ["rh"]=>
        string(1) "1"
        ["epw"]=>
        string(1) "1"
        ["kt"]=>
        string(3) "KT0"
      }
    }
    [1]=>
    array(1) {
      ["HM"]=>
      array(7) {
        ["start"]=>
        string(10) "01.01.2007"
        ["end"]=>
        string(10) "01.10.2007"
        ["toon"]=>
        string(4) "1100"
        ["mgb"]=>
        string(1) "1"
        ["rh"]=>
        string(1) "1"
        ["epw"]=>
        string(1) "1"
        ["kt"]=>
        string(3) "KT0"
      }
    }
    [2]=>
    array(1) {
      ["HM"]=>
      array(7) {
        ["start"]=>
        string(10) "01.01.2007"
        ["end"]=>
        string(10) "31.12.2007"
        ["toon"]=>
        string(4) "1100"
        ["mgb"]=>
        string(1) "1"
        ["rh"]=>
        string(1) "2"
        ["epw"]=>
        string(1) "2"
        ["kt"]=>
        string(3) "KT0"
      }
    }
  }
}

Wie man sieht, sind es mehrere verschachtelte Objekte.

Dazu habe ich noch ein 2. Array was in etwa genauso aussieht, allerdings ein Wert fehlt.
PHP:
array(1) {
  ["hm-bio"]=>
  array(2) {
    [0]=>
    array(1) {
      ["BIO"]=>
      array(7) {
        ["start"]=>
        string(10) "01.01.2009"
        ["end"]=>
        string(10) "31.12.2009"
        ["toon"]=>
        string(3) "240"
        ["mgb"]=>
        string(1) "1"
        ["rh"]=>
        string(1) "1"
        ["epw"]=>
        string(1) "1"
        ["kt"]=>
        string(3) "KT0"
      }
    }
    [1]=>
    array(1) {
      ["HM"]=>
      array(7) {
        ["start"]=>
        string(10) "01.01.2009"
        ["end"]=>
        string(10) "31.12.2009"
        ["toon"]=>
        string(4) "1100"
        ["mgb"]=>
        string(1) "1"
        ["rh"]=>
        string(1) "2"
        ["epw"]=>
        string(1) "2"
        ["kt"]=>
        string(3) "KT0"
      }
    }
  }
}

Mein Ziel ist es diese beiden Arrays zu vergleichen und daraus ein neues zu machen, und zwar so, dass das in dem 2. oder 1. Array fehlt drinn steht.

Ich habe es schon mit array_diff() probiert, allerdings bekomm ich da kein Ergebnis. Hat jemand eine Idee?

Vielen Dank
mfg
Dreambaser
 
PHP:
function arr_diff($a1,$a2){
  foreach($a1 as $k=>$v){
    unset($dv);
    if(is_int($k)){
      // Compare values
      if(array_search($v,$a2)===false) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[]=$dv;
    }else{
      // Compare noninteger keys
      if(!$a2[$k]) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[$k]=$dv;
    }   
  }
  return $diff;
}

Die dazugehörige Funktion heißt [phpf]array_diff[/phpf] und diese Funktion hier habe ich aus den Kommentaren geklaut. Da du keine PHP lauffähige Version deines Array gepostet hast, konnte ich es nicht nachprüfen ;)
 
Hallo,

hmm kann es sein, das alle Values verglichen werden? Er zeigt mir nämlich alle Einträge an.
Um den Hintergrund mal zu erklären. Es gibt immer einen Knoten toon, der eine bestimmte Größe hat.
Diesen will ich bei beiden Arrays vergleichen und daraus den Unterschied mir anzeigen lassen.
Kann man vielleicht da auch anderes ran gehen?
Hast du ne Idee?

mfg
Dreambaser

P.S.: ich nutze zur Zeit die PHP 5.2.6 Version
 
Zuletzt bearbeitet:
Dann gib doch mal bitte eine Version deines Arrays, damit man selber testen kann.
Entweder als PHP Version oder auch serialisiert.

Ansonsten gibt es noch [phpf]array_udiff[/phpf] und seine zwei Funktionspartnern, in denen du selber Funktionen zur Unterscheidung schreiben kannst.
 
Zuletzt bearbeitet:
Die Daten kommen zwar aus einer DB ich kann dir aber die serialisierten Strings geben. Die findest du im Anhang, da diese schon zu groß sind.

Kannst du damit was anfangen?

mfg
Dreambaser
 

Anhänge

Da kriege ich leider 'nen Error... :(

Aber ich habe die arr_diff Funktion mal überarbeitet und bei mir funktioniert sie jetzt.

PHP:
<?php
function arr_diff($a1,$a2){
  $diff = array();
  foreach($a1 as $k=>$v){
    $dv = '';
    if(is_int($k)){
      // Compare values
      if(array_search($v,$a2)===false) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[]=$dv;
    }else{
      // Compare noninteger keys
      if(@!$a2[$k]) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[$k]=$dv;
    }   
  }
  return $diff;
}  

$arr1 = array(
	
	'bio1' => array(
				'BIO' => array(
					'value1' => 1,
					'value2' => 2
				)
	),
	'bio2' => array(
				'BIO' => array(
					'value1' => 1,
					'value2' => 2
				)
	),
	'bio3' => array(
				'BIO' => array(
					'value1' => 1,
					'value2' => 2
				)
	)
);
$arr2 = array(
	
	'bio1' => array(
				'BIO' => array(
					'value1' => 1,
					'value2' => 2
				)
	),
	'bio2' => array(
				'BIO' => array(
					'value1' => 1,
					'value2' => 2
				)
	)
);
print_r(arr_diff($arr1, $arr2));
?>
 
So ich hab jetzt nochmal das Beispiel in die Textdatei übernommen.
Diese brauchst du nur umschreiben in arrays_2.php und dann kannst du
es testen. Es kommen keine Fehlermeldungen.

Soweit so gut. Er listet jetzt allerdings immernoch alle Inhalte auf. Kann man nicht die Anzahl der unterschiedlichen Knoten auch testen und daraus dann den Eintrag wählen, der nicht 2 mal vorkommt?

Danke dir.

mfg
Dreambaser
 

Anhänge

Zurück