PHP: menggabungkan dua array sambil menyimpan kunci alih-alih pengindeksan ulang?

255

Bagaimana saya bisa menggabungkan dua array (satu dengan string => nilai pasangan dan lainnya dengan int => pasangan nilai) sambil menjaga string / kunci int? Tak satu pun dari mereka akan tumpang tindih (karena satu hanya memiliki string dan yang lainnya hanya memiliki bilangan bulat).

Ini kode saya saat ini (yang tidak berfungsi, karena array_merge mengindeks ulang array dengan kunci integer):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);
Garrett
sumber
1
Itu aneh: menurut halaman doc PHP, array_merge seharusnya tidak melakukan itu. Apakah kunci string sebenarnya merupakan representasi string bilangan bulat?
owenmarshall
array_merge sedang mengindeks ulang array kedua saya. yaitu. itu mengubah array dari array( 123 => "VALUE123" )kearray( 0 => "VALUE123" )
Garrett
hmm, itu menarik. Saya kira dokumentasi PHP bisa sedikit tidak jelas tentang hal itu. Ia mengatakan apa yang akan terjadi jika semua array memiliki kunci numerik, tetapi tidak secara spesifik mengatakan apa yang akan terjadi jika mereka tidak.
Steven Oxley
mungkin tidak 2 tahun yang lalu. Tetapi pada tahun 2012, dokumentasi sangat jelas tentang hal ini.
cartbeforehorse
Sebenarnya, dokumentasinya masih belum jelas. "Numerik" sebenarnya termasuk string dengan semua digit (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein

Jawaban:

557

Anda cukup 'menambah' array:

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
SirDarius
sumber
44
Berhati-hatilah dengan ini! Operator + bukan tambahan, ini adalah gabungan. Jika kunci tidak tumpang tindih maka semuanya baik-baik saja, tetapi jika itu ...
GordonM
3
Wow - Anda menyelamatkan saya seember kode, hampir tiga tahun berlalu.
Stephen O'Flynn
86
Kalau-kalau ada yang bertanya-tanya 'bagaimana kalau mereka tumpang tindih? : php.net: "Operator + mengembalikan array kanan yang ditambahkan ke array kiri; untuk kunci yang ada di kedua array, elemen dari array kiri akan digunakan, dan elemen yang cocok dari kanan - Array tangan akan diabaikan. "
Flion
2
@Lion lebih rumit dari itu. Menggunakan '+', saya baru saja menambahkan dua sub-array dengan elemen dengan kunci umum dan subkunci: nilai tambah! 100000 => array (size = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => array (size = 1) 2 => int 30 Hasil: 100000 => array (size = 3) 1 => int 128 2 => int 86 3 => int 7 Pada dasarnya menambahkan [2 => 56] + [2 => 30] tidak menggantikan nilai tetapi menambahkannya dan menjadi [2 => 86]
Dario Fumagalli
1
@DarioFumagalli Saya tidak tahu apakah saya salah paham atau hanya berubah sejak 2016, tetapi pada saat ini, operasi print_r([2 => 56] + [2 => 30]);menghasilkan Array ( [2] => 56 ). Jadi, itu menjaga sisi kiri seperti yang ditentukan. Ini adalah sebagai PHP 7.1.19, berjalan pada repl.it .
Charles Wood
62

Mengingat yang Anda miliki

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

Melakukan $merge = $replacement + $replaced;kehendak output:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

Array pertama dari jumlah akan memiliki nilai dalam output akhir.

Melakukan $merge = $replaced + $replacement;kehendak output:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');
CRK
sumber
[[thumbsup]] untuk yang satu ini
Jhourlad Estrella
21
Singkatnya, saat menambahkan 2 array, nilai dari nilai override pertama dari yang kedua.
Dziamid
1
Saya pikir yang kedua akan menggantikan yang pertama. :)
Asim KT
1
Persis. Itu sebabnya saya tidak bisa menggunakan $allValues += $newValues;.
MarthyM
Melakukan $merge = $replacement + $replaced;akan menampilkan:Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma
24

Meskipun pertanyaan ini cukup lama, saya hanya ingin menambahkan kemungkinan melakukan penggabungan sambil menyimpan kunci.

Selain itu menambahkan kunci / nilai ke array yang ada menggunakan + tanda Anda bisa melakukan array_replace.

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

Hasilnya adalah:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

Kunci yang sama akan ditimpa oleh array yang terakhir.
Ada juga array_replace_recursiveyang melakukan ini untuk subarrays juga.

Contoh langsung di 3v4l.org

danopz
sumber
3

Dua array dapat dengan mudah ditambahkan atau bergabung tanpa mengubah indeks aslinya dengan operator + . Ini akan sangat membantu penuh dalam dropdown pilih laravel dan codeigniter.

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

Output akan menjadi:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );
amba patel
sumber
1

Coba fungsi array_replace_recursive atau array_replace

$a = array('userID' => 1, 'username'=> 2);
array (
  userID => 1,
  username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
  'userID' => 1,
  'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
  userID => 1,
  username => 2,
  companyID => 3
)

http://php.net/manual/en/function.array-replace-recursive.php

zdenek
sumber