2010-08-17 25 views
12

Sadece onlardan benzersiz değerleri almaya çalıştığım 2 dizim var. Yani sadece kopyaları çıkarmaya çalışmıyorum, aslında iki kopyasını çıkarmaya çalışıyorum.2 diziden benzersiz değerler alma

$array1 = array(); 
$array2 = array(); 

foreach($values1 as $value1){ //output: $array1 = 10, 15, 20, 25; 
    $array1[] = $value1; 
} 

foreach($values2 as $value2){ //output: $array2 = 10, 15, 100, 150; 
    $array2[] = $value2; 
} 

aradığım son çıkış bu yapılan almak için herhangi bir temiz yolu

$output = 20, 25, 100, 150; 

geçerli:

Yani böyle 2 diziler alıyorum olur?

+0

Bu diziler gerçekten diziler midir, yoksa haritalar mıdır? Sorumu daha net hale getirmek için, anahtarlarınız 0,1,2 mi, yoksa kelimeler mi? – codersarepeople

+0

@codersarepeople Dizi haritaları değiller.Sayıları içeren ayrı ayrı dizilerdir. Biri 3 değer ve diğer 10 değer olabilir. Sadece ikisi de tesadüf. 4. – lok

cevap

28

Diğer yanıtlar doğru yolda, ancak array_diff yalnızca bir yönde çalışır - örn. Başka hiçbir durumda olmayan verilen ilk dizide bulunan değerleri döndürür.

Ne yapmak istediğiniz farklılıkları bir arada birleştirme sonra her iki yönde de farkını almak ve geçerli: ... Daniel Vandersluis cevabı olumsuz etkisi değil

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 
$output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1)); 
// $output will be (20, 25, 100, 150); 
-1

İşte

$output = array_diff($array1, $array2); 
+2

Bu size beklediğiniz sonucu vermeyecektir, çünkü 'array_diff' sadece ilk dizide bulunan değerleri döndürür. Daha fazla bilgi için cevabımı görün. –

+2

Bu, yalnızca dizi 1'den dizi 2'ye olan farkı döndürecek ve yalnızca dizi2'de bulunmayan dizi1 öğelerini gösterecektir. Her iki dizi dizisini karşılaştırmanız gerekir. –

3

array_diff() bunu yapmak için kodudur görüyoruz. Bu optimize edilmesi mümkün olabilir, ancak fikir olsun:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 

$new_array = array(); 
foreach($array1 as $value) { 
    if(!in_array($value, $array2)) { 
     array_push($new_array, $value); 
    } 
} 
foreach($array2 as $value) { 
    if(!in_array($value, $array1)) { 
     array_push($new_array, $value); 
    } 
} 

print_r($new_array); 

array_diff kullanmak için yapmanız gerekir: array_diff() (manual) işlevi bulmak için kullanılabilir

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 

$out1 = array_diff($array1, $array2); 
$out2 = array_diff($array2, $array1); 
$output = array_merge($out1, $out2); 

print_r($output); 
0

iki dizinin arasındaki fark: istediğiniz işleve gibi birçok diziler geçebilir

$array1 = array(10, 20, 40, 80); 
$array2 = array(10, 20, 100, 200); 
$diff = array_diff($array1, $array2); 
// $diff = array(40, 80, 100, 200); 

, sadece iki diziler bunlarla sınırlı değildir.

+3

Hatalı - kodunuz ile '$ diff' dizisi olacaktır (40, 80)'. 'array_diff' sadece tek yönde çalışır. Daha fazla bilgi için cevabımı görün. –

6

ama buna eklemek

Aradığınız şey temel olarak dizilerin bir XOR operasyonu. Bu amaçla, http://php.net/manual/en/function.array-diff.php yorumunda, "dorproject de merlinyoda net nokta" Aşağıdaki rutin sağlanan:

<?php 
function array_xor ($array_a, $array_b) { 
    $union_array = array_merge($array_a, $array_b); 
    $intersect_array = array_intersect($array_a, $array_b); 
    return array_diff($union_array, $intersect_array) 
} 
?> 

Bu fonksiyon XOR hesaplama için farklı bir yaklaşım getiriyor.

1

diğer bir iyi çözüm şudur:

$ Dizi1 = dizisi (10, 15, 20, 25);

$ array2 = array (10, 15, 100, 150);

$ output = array_diff (array_merge ($ dizi1, $ dizi2), array_intersect ($ dizi1, $ dizi2));

// $ çıktı (20, 25, 100, 150);

İlgili konular