@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.
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.
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))
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)
@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.
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.
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
The +Operator menghasilkan hasil yang sama seperti array_replace () . Namun karena argumen operator dibalik, urutan array yang dihasilkan juga mungkin berbeda.
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)
Apakah urutan +dijamin oleh spesifikasi? Bagaimana dengan array_replace?
Pacerier
1
Operasi array plus memperlakukan semua array sebagai array assoc.
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;}
+=
dan jawabannya sudah diterima+
. Dari pengujian saya, mereka tampaknya berperilaku sama.array_merge
? Seolah-olah array secara default array asosiatif dan array numerik adalah warga negara kelas dua.Jawaban:
Mengutip dari Manual PHP tentang Operator Bahasa
Jadi, jika Anda melakukannya
Kamu akan mendapatkan
Jadi logika
+
setara dengan cuplikan berikut:Jika Anda tertarik dengan detail implementasi C-level, langsung ke
Catatan, itu
+
berbeda dari caraarray_merge()
menggabungkan array:akan memberimu
Lihat halaman tertaut untuk contoh lebih lanjut.
sumber
+
danarray_merge
memanggil dizend_hash_merge
bawah tenda. Ini juga diharapkan, karena dalam array PHP diimplementasikan sebagai peta hash yang dipesan.+
danarray_merge
jahat 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_merge
dapat digunakan untuk meringkas array seperti daftar tetapi+
tidak bisa. Berbeda denganarray_merge
,+
selalu melakukan operasi yang akan disebut "gabungan" dalam bahasa lain.array_concat
dapat dibuatarray_merge
.Contoh terbaik yang saya temukan untuk menggunakan ini adalah dalam array konfigurasi.
The
$default_vars
, karena menunjukkan, adalah array untuk nilai default. The$user_vars
array akan menimpa nilai yang didefinisikan dalam$default_vars
. Nilai-nilai yang hilang$user_vars
sekarang menjadi default dari vars$default_vars
.Ini akan
print_r
sebagai:Saya harap ini membantu!
sumber
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 .
sumber
Hati-hati dengan kunci numerik, apakah harus dilestarikan atau jika Anda tidak ingin kehilangan apa pun
Persatuan
menggabungkan
sumber
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:
output:
sumber
+
dijamin oleh spesifikasi? Bagaimana denganarray_replace
?Saya memposting kode di bawah ini untuk memperjelas.
$a + $b = array_plus($a, $b)
sumber
Ini akan menambahkan array baru ke sebelumnya.
sumber
Array ([0] => contoh [1] => tes)
sumber