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

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,
)

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

[[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


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',
 );

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.