2013-04-21 18 views
7

Şu an saatlerce bunu almaya çalışıyorum.İki çok boyutlu dizileri karşılaştırın ve ardından sadece benzersiz bir dizi oluşturun

İki boyutlu diziler

$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 
    ) 
) 

Ben $ newData ve $ oldData karşılaştırmak ve ilk ortak dizinin önce sadece yeni verileri kapmak gerekir var.

Benim $ newData sonra olacak: Kimlik anahtarlarını karşılaştıran ama hiçbir şey düzgün çalışıp çalışmadığını ben array_unique gelen her şeyi denedim

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

)

.

Önce onları birleştirmem gerekiyor mu? onları haritalamak? Bahh, hiçbir fikrim yok, çok kayboldum.

Herhangi bir yardım ben iç içe bir foreach döngüsü tıpkı ediyorum

cevap

7

harika olurdu. Ben kullanarak, fakat PHP ($) bu kadar olduğunu varsayıyoruz hangi programlama dili bilmiyorum:

$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; 
} 

Ardından $tmpArray değişkenin istenen bir dizi var. Daha sonra $newData = $tmpArray; dersini yapabilirsiniz.

+0

Ben ile tmpArray – Ryan

+0

$ print_r küçük manipülasyon, bu çalışır. teşekkür ederim. – Ryan

+0

o zaman belli ki bir şeyi yanlış yazmışsın. Burada http://pastebin.com/jJgDvLxE bu kodu denerseniz ben kudretini Sen sonucunda istediğini tam diziyi ... –

1

$oldData ilk öğeyi bulana kadar $newData üzerinde yineleyin?

$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; 
} 

Yeni veri $data saklanacaktır.

+1

iki döngüden kaçınarak iyi bir yaklaşım –

0

Bunu nasıl kullanırsınız? yinelenen varsa thelamborghinistory's cevabı,

ayarını kaldır dinamik anahtar değiştirerek.

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; 
} 

Ve kendi kendine aramak zorunda, o zaman, boş bir dizi döndürür ne şu anda sahip kilit isimleri değiştirerek kodunuzu kopyalayarak

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