2011-06-30 42 views
46

iki diziler birleştirin:Böyle iki diziler var

array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44' 
); 

array( 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 

Ben çoğaltmak ve yanı sıra bunların orijinal anahtarları tutmak içerir etmediği şekilde bu iki dizi birleştirmek istiyorum. Örneğin çıktısı olmalıdır:

array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 

Bunu denedim ama orijinal anahtarlarını değişiyor:

$output = array_unique(array_merge($array1 , $array2)); 

Herhangi çözüm?

cevap

92

Hemen kullanın:

$output = array_merge($array1, $array2); 

bunu çözmek gerektiğini. Bir anahtar birden fazla kez (örneğin örneğinizde '44' gibi) oluşursa, bir anahtar, aynı ada sahip olan yordamların üzerine yazılır. Çünkü sizin durumunuzda her ikisi de aynı değere sahip olurlarsa, fark etmez ve aynı zamanda kopyaları da kaldıracaktır.

Güncelleme: Ben sadece PHP sayılar (tamsayı) gibi sayısal dize anahtarlarını sayan, fark ve bu yüzden çok anahtarlarını yeniden numaralandırır olduğu, ne anlama geldiğini, böyle davranacaktır ...

bir geçici çözüm için anahtarları yeniden oluşturun.

$output = array_combine($output, $output); 

Güncelleme 2: Hep bir operatör de olduğu, unutmak (bu gerçektençünkü kalın ne arıyorsun!: D)

$output = $array1 + $array2; 
+3

@KingCrunch - Sayılar kote olsa bile, bunlar ** dize değil ** ve dizin ** korunmaz. Örnek: https://ideone.com/I2NFT –

+0

Gerçekten ... İlk önce "bir hata" hakkında konuşmak istedim, ancak farkettim ki, bu kılavuz sadece "sayı tuşları" yerine "sayısal tuşlar" dan bahsediyor. Biraz kafa karıştırıcı geliyor. – KingCrunch

+0

+1 Operatörü unuttum! Mükemmel (bu kısmı kalınlaştır!);)) –

4

yapmak için ve biri bu yapabilirsiniz döngü diğer eklenecek:

<?php 

$test1 = array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44' 
); 

$test2 = array( 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 


function combineWithKeys($array1, $array2) 
{ 
    foreach($array1 as $key=>$value) $array2[$key] = $value; 
    asort($array2); 
    return $array2; 
} 

print_r(combineWithKeys($test1, $test2)); 

?> 

GÜNCELLEME: KingCrunch best solution ile geldi: print_r($array1+$array2);

22

Bu çalışır:

$output = $array1 + $array2; 
+3

Tavsiye etmem çünkü bu davranış çok belirsiz, örneğin [1,2,3] + [4,5,6] == [1,2,3] ' – jchook

+0

@jchook Bundan sonra ne önerirsiniz? – Michas

+0

İhtiyacım olan bu, teşekkürler. İşte nedeni: 'http_build_query (array_merge ($ dizi1, $ dizi2))' 'benim için çalışmadı, 'http_build_query ($ dizi1 + $ dizi2)' yaptı. – BarryMode

2

Bu çalışır:

$a = array(1 => 1, 2 => 2, 3 => 3); 
$b = array(4 => 4, 5 => 5, 6 => 6); 
$c = $a + $b; 
print_r($c); 
20

Sen dikkate almalıdır $ ile $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1', 
'22' => 'x1' 
); 

$array2 = array(
'22' => 'x2', 
'33' => 'x2' 
); 

o dizi1 + $ dizi2

$array1 + $array2 = array(
'11' => 'x1', 
'22' => 'x1', 
'33' => 'x2' 
); 

ve $ dizi2 + $ dizi1

$array2 + $array1 = array( 
'11' => 'x1', 
'22' => 'x2', 
'33' => 'x2' 
); 
1

Uyarı ile!(Çok boyutlu diziler için) benim çözüm kullanmaktır böylece $ dizi1 + $ dizi2, anahtarları üzerine yazar array_unique()

array_unique(array_merge($a, $b), SORT_REGULAR); 

Uyarı:

5.2.10+sort_flags varsayılan değerini değiştirdi SORT_STRING.

5.2.9 Varsayılan SORT_REGULAR şeklindedir.

5.2.8- Standart

O perfectly works

SORT_STRING edilir. Umarım aynı yardımcı olur.

+1

'array_merge()', tuşları korumaz. Bu tarafından oluşturulan dizi endeksli. – HPierce

+0

@HPierce, çok boyutlu dizi ekleme durumunda, '+' kullanılarak bazı bilgiler kaybolacaktır. Bir göz atın: [PHPFiddle] (https://www.tehplayground.com/dHlrF78YWWh5jC8H), $ b [0] kaybolacak ... –