2013-04-21 13 views
7

Ich habe das schon seit Stunden versucht.Vergleichen Sie zwei mehrdimensionale Arrays und erstellen Sie dann ein Array nur einmal.

Ich habe zwei mehrdimensionale Arrays

$newData (
    [0] => Array(
     [id] => 1 
     [name] => John 
     [sex] => male 
    ) 
    [1] => Array(
     [id] => 2 
     [name] => Kenny 
     [sex] => male 
    ) 
    [2] => Array(
     [id] => 3 
     [name] => Sarah 
     [sex] => female 
    ) 
    [3] => Array(
     [id] => 4 
     [name] => George 
     [sex] => male 
    ) 
) 

$oldData (
    [0] => Array(
     [id] => 3 
     [name] => Sarah 
     [sex] => female 
    ) 
    [1] => Array(
     [id] => 4 
     [name] => George 
     [sex] => male 
    ) 
    [2] => Array(
     [id] => 5 
     [name] => Peter 
     [sex] => male 
    ) 
    [3] => Array(
     [id] => 6 
     [name] => Lexi 
     [sex] => female 
    ) 
) 

Ich brauche $ newData und $ olddata zu vergleichen und nur die neuen Daten greifen, die vor dem ersten gemeinsamen Array ist.

My $ newData ist dann:

$newData (
[0] => Array(
    [id] => 1 
    [name] => John 
    [sex] => male 
) 
[1] => Array(
    [id] => 2 
    [name] => Kenny 
    [sex] => male 
) 

)

ich alles von array_unique versucht haben, wenn die ID-Schlüssel zu vergleichen, aber nichts funktioniert einwandfrei.

Muss ich sie zuerst zusammenführen? map sie? Bah, ich habe keine Ahnung, ich bin so verloren.

Jede Hilfe wäre

Antwort

7

würde ich nur tun, eine verschachtelte foreach-Schleife genial. Ich weiß nicht, welche Programmiersprache Sie verwenden, aber davon aus, dass es PHP ($) ist:

$tmpArray = array(); 

foreach($newData as $data1) { 

    $duplicate = false; 
    foreach($oldData as $data2) { 
    if($data1['id'] === $data2['id'] && $data1['name'] === $data2['name'] && $data1['sex'] === $data2['sex']) $duplicate = true; 
    } 

    if($duplicate === false) $tmpArray[] = $data1; 
} 

Sie dann in der $tmpArray Variable das gewünschte Array. Sie können natürlich $newData = $tmpArray; danach machen.

+0

von Ihrem Code kopieren und dann das Ändern der Schlüsselnamen zu dem, was ich im Moment haben, ist es ein leeres Array zurück, wenn ich $ tmpArray – Ryan

+0

Mit einem print_r kleine Manipulation, das funktioniert. Danke. – Ryan

+0

Dann hast du dich offensichtlich etwas vertippt. Wenn ich diesen Code hier versuche http://pastebin.com/jJgDvLxE bekomme ich genau das Array das Du als Ergebnis haben wolltest ... –

1

Einfach über $newData iterieren, bis Sie das erste Element von $oldData finden?

$cmp = $oldData[0]; 
$data = array(); 
foreach ($newData as $el) { 
    if ($el['id'] === $cmp['id'] 
     && $el['name'] === $cmp['name'] 
     && $el['sex'] === $cmp['sex']) 
     break; 
    $data[] = $el; 
} 

Ihre neuen Daten werden in $data gespeichert werden.

+1

guter Ansatz durch die Vermeidung der Verwendung von zwei Schleifen –

0

Wie wäre es damit? Durch Ändern der thelamborghinistory's Antwort,

Deaktivieren Sie den dynamischen Schlüssel, wenn ein Duplikat vorhanden ist.

public function removeDuplicate($oldData, $newData, $key) 
{ 
    $tmpArray = array(); 
    foreach ($newData as $data1) { 
     $duplicate = false; 
     foreach ($oldData as $data2k => $data2v) { 
      if ($data1[$key] === $data2v[$key]) { 
       unset($newData[$data2k]); 
       $duplicate = true; 
      } 
     } 
     if ($duplicate === true) { 
      $tmpArray[] = $data1; 
     } else { 
      $tmpArray[] = $data1; 
     } 
    } 
    return $tmpArray; 
} 

Und dann muss man einfach anrufen,

removeDuplicate($oldData, $newData, 'name');//or whatever you want 
Verwandte Themen