Gabungkan dua larik

91

Saya memiliki dua array seperti ini:

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

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

Saya ingin menggabungkan dua larik ini sedemikian rupa sehingga tidak mengandung duplikat dan juga menyimpan kunci aslinya. Misalnya keluarannya harus:

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

Saya telah mencoba ini tetapi itu mengubah kunci aslinya:

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

Ada solusi?

Awan
sumber

Jawaban:

165

Gunakan saja:

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

Itu harus menyelesaikannya. Karena Anda menggunakan kunci string jika satu kunci muncul lebih dari satu kali (seperti '44'dalam contoh Anda) satu kunci akan menimpa kunci prosedural dengan nama yang sama. Karena dalam kasus Anda keduanya memiliki nilai yang sama, itu tidak masalah dan itu juga akan menghapus duplikat.

Pembaruan: Saya baru saja menyadari, bahwa PHP memperlakukan kunci-string numerik sebagai angka (bilangan bulat) dan akan berperilaku seperti ini, yang berarti, bahwa itu mengganti nomor kunci juga ...

Solusinya adalah dengan membuat ulang kunci.

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

Pembaruan 2: Saya selalu lupa, bahwa ada juga operator (dicetak tebal, karena ini benar - benar yang Anda cari!: D)

$output = $array1 + $array2;

Semua ini dapat dilihat di: http://php.net/manual/en/function.array-merge.php

KingCrunch
sumber
5
@KingCrunch - Meskipun angka dikutip, itu bukan kunci string sehingga indeks tidak akan dipertahankan. Contoh: ideone.com/I2NFT
Brendan Bullen
1
Sungguh ... Pertama saya ingin berbicara tentang "bug", tetapi kemudian saya perhatikan, bahwa manual hanya berbicara tentang "kunci numerik", bukan "kunci integer". Terasa agak membingungkan.
KingCrunch
1 Saya lupa tentang operatornya! Luar biasa (taruh bagian itu dalam huruf tebal!;))
Brendan Bullen
4
Jadi $array1 + $array2adalah solusi yang singkat dan efisien daripada array_merge() - array_combine()kombinasi
Awan
2
PERINGATAN! untuk array non-assoc atau jika array memiliki kunci yang sama$a + $b != array_merge($a, $b)
jmarceli
33

Anda harus mempertimbangkan itu $array1 + $array2 != $array2 + $array1

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

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

dengan $ array1 + $ array2

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

dan dengan $ array2 + $ array1

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

Ini bekerja:

$output = $array1 + $array2;
Michas
sumber
12
Saya tidak akan merekomendasikan ini karena perilakunya sangat tidak intuitif, misalnya[1,2,3] + [4,5,6] == [1,2,3]
jchook
@jchook Lalu apa yang Anda rekomendasikan?
Michas
Ini yang saya butuhkan, terima kasih. Inilah alasannya: http_build_query(array_merge($array1, $array2))tidak berhasil untuk saya, sedangkan http_build_query($array1 + $array2)berhasil.
BarryMode
4

Untuk melakukan ini, Anda dapat melakukan loop melalui satu dan menambahkan yang lain:

<?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));

?>

UPDATE: KingCrunch hadir dengan solusi terbaik :print_r($array1+$array2);

Brendan Bullen
sumber
2

Jika Anda menggunakan PHP 7.4 atau lebih tinggi, Anda dapat menggunakan operator penyebaran ...seperti contoh berikut dari PHP Docs:

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

Ia bekerja seperti di JavaScript ES6.

Lihat selengkapnya di https://wiki.php.net/rfc/spread_operator_for_array .

Mahasiswa Sains
sumber
Ini tidak berlaku untuk pertanyaan tersebut. OP memiliki kunci string untuk array (Itu tidak bekerja dengan operator penyebaran) dan OP ingin mempertahankan kunci (operator penyebaran membuang kunci). Juga OP tidak menginginkan duplikat.
martti
Oh, saya mengerti maksud Anda. Itu benar, dan kamu benar. Dapatkah Anda memberikan beberapa kode untuk membantu kami meningkatkan jawaban saya untuk orang lain? Saya menghargai waktu Anda! Terima kasih banyak karena telah menunjukkan kekurangan dari jawaban saya.
Mahasiswa Sains
Saya tidak berpikir operator penyebaran adalah cara untuk pergi ke sini. Alih-alih gunakan jawaban yang diberikan$array1 + $array2
martti
Saya tidak menyadari hal ini! Maksudku, aku tidak tahu apa yang bisa kita lakukan $ouput = $array1 + $array2. Sekarang saya telah belajar sesuatu yang baru! Terima kasih!
Mahasiswa Sains
1

Ini bekerja:

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

Peringatan! $ array1 + $ array2 menimpa kunci, jadi solusi saya (untuk array multidimensi) adalah menggunakan array_unique ()

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

Memperhatikan:

5.2.10+ Mengubah nilai default sort_flagskembali ke SORT_STRING.

5.2.9 Default-nya adalah SORT_REGULAR.

5.2.8- Defaultnya adalah SORT_STRING

Ini bekerja dengan sempurna . Semoga membantu sama.

Norman Edance
sumber
1
array_merge()tidak menyimpan kuncinya. Array yang dibuat oleh itu 0 diindeks.
HPierce
@HPierce baiklah, dalam kasus penambahan array multidimensi, beberapa informasi akan hilang menggunakan +. Lihatlah: PHPFiddle , $ b [0] akan hilang ...
Norman Edance
1

Cara baru untuk melakukannya dengan php7.4 adalah operator Spread [...]

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

Operator penyebar harus memiliki kinerja yang lebih baik dari array_merge

Keuntungan signifikan dari operator Spread adalah ia mendukung objek yang dapat dilalui, sedangkan fungsi array_merge hanya mendukung array.

Shoaib Ahmed
sumber