İki diziyi birleştirin


91

Bunun gibi iki dizim var:

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

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

Bu iki diziyi, kopya içermeyecek ve orijinal anahtarlarını koruyacak şekilde birleştirmek istiyorum. Örneğin çıktı şöyle 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ştiriyor:

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

Herhangi bir çözüm?

Yanıtlar:


165

Sadece kullan:

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

Bu onu çözmeli. Dize anahtarlarını kullandığınız için, eğer bir anahtar birden fazla kez meydana gelirse ( '44'örneğinizde olduğu gibi ), bir anahtar aynı ada sahip olan prosedürlerin üzerine yazacaktır. Çünkü sizin durumunuzda her ikisinin de aynı değere sahip olması önemli değil ve aynı zamanda kopyaları da kaldıracaktır.

Güncelleme: PHP'nin sayısal dizgi anahtarlarını sayılar (tamsayılar) olarak ele aldığını ve bu şekilde davranacağını, yani anahtarları da yeniden numaralandırdığını fark ettim ...

Çözüm, anahtarları yeniden oluşturmaktır.

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

Güncelleme 2: Bir operatörün de olduğunu her zaman unutuyorum (kalın yazılmış, çünkü gerçekten aradığınız şey bu!: D)

$output = $array1 + $array2;

Bunların tümü şu adreste görülebilir: http://php.net/manual/en/function.array-merge.php


5
@KingCrunch - sayılar alıntı rağmen, olanlardır değil dize tuşları ve endeks böylece değil korunacaktır. Örnek: ideone.com/I2NFT
Brendan Bullen

1
Gerçekten ... Önce "bir hata" dan bahsetmek istedim, ama sonra fark ettim ki, kılavuz "tamsayı tuşlarından" değil, sadece "sayısal tuşlardan" bahsetti. Biraz kafa karıştırıcı geliyor.
KingCrunch

+1 Operatörü unuttum! Mükemmel (bu bölümü kalın olarak yazın
!;

4
Yani $array1 + $array2yerine kısa ve etkili bir çözümdür array_merge() - array_combine()kombinasyonu
Awan

2
UYARI! assoc olmayan diziler için veya dizilerin ortak anahtarları varsa$a + $b != array_merge($a, $b)
jmarceli

33

Bunu dikkate almalısın $array1 + $array2 != $array2 + $array1

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

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

ile $ dizi1 + $ dizi2

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

ve $ dizi2 + $ dizi1 ile

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

25

Bu çalışıyor:

$output = $array1 + $array2;

12
Bunu tavsiye etmem çünkü davranışları çok [1,2,3] + [4,5,6] == [1,2,3]
mantıksız

@jchook O halde ne önerirsiniz?
Michas

İhtiyacım olan şey bu, teşekkürler. İşte nedeni: http_build_query(array_merge($array1, $array2))benim için işe yaramadı, oysa işe http_build_query($array1 + $array2)yaradı.
BarryMode

4

Bunu yapmak için, birinden geçip diğerine ekleyebilirsiniz:

<?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 en iyi çözümü buldu :print_r($array1+$array2);


2

PHP 7.4 veya üzerini kullanıyorsanız, yayılma işlecini ...PHP Belgelerinden aşağıdaki örnekler olarak kullanabilirsiniz :

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

JavaScript ES6'daki gibi çalışır.

Https://wiki.php.net/rfc/spread_operator_for_array'de daha fazlasını görün .


Bu soru için geçerli değil. OP, dizi için dize anahtarlarına sahiptir (Bu, yayılma operatörü ile çalışmaz) ve OP, anahtarları korumak ister (yayılma operatörü anahtarları atar) Ayrıca OP, kopyaları istemez.
Martti

Oh, puanlarını görüyorum. Bu doğru ve haklısın. Yanıtımı başkaları için geliştirmemize yardımcı olacak bir kod verebilir misiniz? Zaman ayırdığınız için minnettar olurum! Cevabımın sakıncalarına işaret ettiğiniz için çok teşekkür ederim.
Student of Science

Yayılma operatörünün buraya gitmenin yolu olduğunu sanmıyorum. Bunun yerine verilen cevabı kullanın$array1 + $array2
martti

Bunun farkında değildim! Demek istediğim, yapabileceğimizi bilmiyordum $ouput = $array1 + $array2. Şimdi yeni bir şey öğrendim! Teşekkür ederim!
Student of Science

1

Bu çalışıyor:

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

1

Uyarı! $ dizi1 + $ dizi2 anahtarların üzerine yazar, bu nedenle benim çözümüm (çok boyutlu diziler için) array_unique () kullanmaktır

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

Farkına varmak:

5.2.10+sort_flags Geri varsayılan değeri SORT_STRING olarak değiştirildi.

5.2.9 Varsayılan SORT_REGULAR'dır.

5.2.8- Varsayılan SORT_STRING'dir

Bu mükemmel çalışıyor . Umarım aynı yardımcı olur.


1
array_merge()Yine de anahtarları korumaz. Bunun tarafından oluşturulan dizi 0 dizinlidir.
HPierce

@Herce iyi, çok boyutlu dizi toplama durumunda bazı bilgiler kullanılırken kaybolacaktır +. Bir göz atın: PHPFiddle , $ b [0] kaybolacak ...
Norman Edance

1

Php7.4 ile bunu yapmanın yeni yolu Yayılma operatörü [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

Yayılma operatörü, daha iyi performansa sahip olmalıdır. array_merge

Yayılma operatörünün önemli bir avantajı, herhangi bir çapraz nesneyi desteklemesi, dizi_merge işlevi ise yalnızca dizileri desteklemesidir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.