+ operator untuk array dalam PHP?

192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

Apa +artinya array dalam PHP?

pengguna198729
sumber
5
Saya perhatikan pertanyaan Anda sudah +=dan jawabannya sudah diterima +. Dari pengujian saya, mereka tampaknya berperilaku sama.
user151841
7
The dokumentasi merangkum cukup baik
artfulrobot
1
kemungkinan rangkap dari Referensi - Apa arti simbol ini dalam PHP?
Robbie Averill
@RobbieAverill - ini adalah pertanyaan yang dirujuk oleh pertanyaan Referensi. Jadi jika ada yang pertanyaan Referensi adalah duplikat
icc97
2
Apakah ada orang lain yang sedikit ngeri bahwa hal mendasar seperti rangkaian array harus dilakukan array_merge? Seolah-olah array secara default array asosiatif dan array numerik adalah warga negara kelas dua.
icc97

Jawaban:

271

Mengutip dari Manual PHP tentang Operator Bahasa

Operator + mengembalikan array kanan yang ditambahkan ke array kiri; untuk kunci yang ada di kedua array, elemen dari array sebelah kiri akan digunakan, dan elemen yang cocok dari array sebelah kanan akan diabaikan.

Jadi, jika Anda melakukannya

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

Kamu akan mendapatkan

Array
(
    [0] => one   // preserved from $array1 (left-hand array)
    [1] => two   // preserved from $array1 (left-hand array)
    [foo] => bar // preserved from $array1 (left-hand array)
    [2] => five  // added from $array2 (right-hand array)
)

Jadi logika +setara dengan cuplikan berikut:

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

Jika Anda tertarik dengan detail implementasi C-level, langsung ke


Catatan, itu +berbeda dari cara array_merge()menggabungkan array:

print_r(array_merge($array1, $array2));

akan memberimu

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => baz // overwritten from $array2
    [2] => three // appended from $array2
    [3] => four  // appended from $array2
    [4] => five  // appended from $array2
)

Lihat halaman tertaut untuk contoh lebih lanjut.

Gordon
sumber
1
@Pacerier PHP yang diproduksi oleh php.net tidak memiliki spesifikasi formal, tetapi keduanya +dan array_mergememanggil di zend_hash_mergebawah tenda. Ini juga diharapkan, karena dalam array PHP diimplementasikan sebagai peta hash yang dipesan.
Uskup
1
@Pacerier Dokumen online php.net adalah rekaman terdekat dari spesifikasi, tetapi IMO dokumen tersebut jauh dari spesifikasi yang sebenarnya: satu, mereka diperbarui setelah kode ditulis; dua, mereka tidak ditulis untuk mencakup setiap penggunaan khusus.
Uskup
14
Perilaku PHP +dan array_mergejahat dan tidak intuitif. Mereka bertolak belakang dengan apa yang akan dilakukan oleh pembacaan bahasa Inggris-polos secara intuitif kepada Anda 'menambah' atau 'menggabungkan' array. Bahasa / pustaka lain digunakan +untuk menggabungkan daftar (misalnya dengan Python) dan fungsi "menggabungkan" untuk menambahkan pasangan kunci / nilai dari satu objek ke objek lain (misalnya dalam lodash). Namun dalam PHP itu sebaliknya; array_mergedapat digunakan untuk meringkas array seperti daftar tetapi +tidak bisa. Berbeda dengan array_merge, +selalu melakukan operasi yang akan disebut "gabungan" dalam bahasa lain.
Mark Amery
1
@ icc97 mereka memang hanya HashMaps. Lihat nikic.github.io/2014/12/22/...
Gordon
2
Saya sudah mencoba mengirimkan bug untuk melihat apakah alias array_concatdapat dibuat array_merge.
icc97
18

Contoh terbaik yang saya temukan untuk menggunakan ini adalah dalam array konfigurasi.

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"[email protected]");

$config = $user_vars + $default_vars;

The $default_vars, karena menunjukkan, adalah array untuk nilai default. The $user_varsarray akan menimpa nilai yang didefinisikan dalam $default_vars. Nilai-nilai yang hilang $user_varssekarang menjadi default dari vars $default_vars.

Ini akan print_rsebagai:

Array(2){
    "username" => "John Doe",
    "email" => "[email protected]"
}

Saya harap ini membantu!

Frank de Jonge
sumber
6

Operator ini menggunakan gabungan dua array (sama dengan array_merge, kecuali bahwa dengan kunci duplikat array_merge ditimpa).

Dokumentasi untuk operator array ditemukan di sini .

Peter Smit
sumber
1
Kata hati-hati untuk pemula di sini, hasil operasi adalah nol jika salah satu dari array adalah nol . Beberapa mungkin tidak peduli dengan asumsi ini karena ini adalah operasi serikat, hasilnya akan menjadi array yang tepat (bukan-nol) jika salah satunya adalah nol. Tapi, itu berlaku jika salah satu array adalah array kosong .
Sandeepan Nath
Jadi, sebagai praktik yang baik, saya pikir, kita harus menginisialisasi array input sebagai array kosong. Apa yang kalian katakan?
Sandeepan Nath
5

Hati-hati dengan kunci numerik, apakah harus dilestarikan atau jika Anda tidak ingin kehilangan apa pun

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

Persatuan

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

menggabungkan

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)
dcaillibaud
sumber
3

The +Operator menghasilkan hasil yang sama seperti array_replace () . Namun karena argumen operator dibalik, urutan array yang dihasilkan juga mungkin berbeda.

Memperluas contoh lain dari halaman ini:

$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order

output:

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => bar // preserved from $array1
    [2] => five  // added from $array2
)
Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [2] => five  // added from $array2
    [foo] => bar // preserved from $array1
)
Tamlyn
sumber
Apakah urutan +dijamin oleh spesifikasi? Bagaimana dengan array_replace?
Pacerier
1
  1. Operasi array plus memperlakukan semua array sebagai array assoc.
  2. Ketika konflik utama selama nilai plus, nilai kiri (sebelumnya) akan disimpan

Saya memposting kode di bawah ini untuk memperjelas.

$a + $b = array_plus($a, $b)

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}
Gucci Koo
sumber
@ Menjalankan kode Tamlyn tampaknya membuktikan bahwa klaim Anda "array plus operasi memperlakukan semua array sebagai array assoc" salah.
Pacerier
@ Passier kunci itu bisa bilangan bulat juga.
Hitesh
-2

Ini akan menambahkan array baru ke sebelumnya.

SorcyCat
sumber
-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

Array ([0] => contoh [1] => tes)

Henning
sumber
1
Utas ini menyebutkan beberapa kali bagaimana array_merge () TIDAK kongruen.
doublejosh
@doublejosh, "kongruen"? Berarti?
Pacerier
1
Mereka tidak sama.
doublejosh