PHP: hợp nhất hai mảng trong khi giữ các khóa thay vì reindexing?


255

Làm cách nào tôi có thể hợp nhất hai mảng (một với các cặp chuỗi => giá trị và một mảng khác với các cặp int => giá trị) trong khi vẫn giữ các khóa chuỗi / int? Không ai trong số họ sẽ chồng chéo lên nhau (vì một chuỗi chỉ có chuỗi và chuỗi kia chỉ có số nguyên).

Đây là mã hiện tại của tôi (không hoạt động, vì mảng_merge đang lập chỉ mục lại mảng bằng các khóa số nguyên):

// 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
Điều đó thật kỳ quặc: theo trang tài liệu PHP, Array_merge không nên làm điều đó. Các khóa chuỗi có thực sự là biểu diễn chuỗi của số nguyên không?
owenmarshall

Array_merge đang giới thiệu lại mảng thứ hai của tôi. I E. nó đang thay đổi mảng từ array( 123 => "VALUE123" )thànharray( 0 => "VALUE123" )
Garrett

hmm, thật thú vị Tôi cho rằng tài liệu PHP có thể không rõ ràng về điểm đó. Nó nói điều gì sẽ xảy ra nếu tất cả các mảng có khóa số, nhưng nó không nói cụ thể điều gì sẽ xảy ra nếu chúng không xảy ra.
Steven Oxley

có lẽ không phải 2 năm trước. Nhưng vào năm 2012, tài liệu đã rõ ràng về điểm này.
cartb Beforehorse

Trên thực tế, các tài liệu vẫn chưa rõ ràng. "Số" thực sự bao gồm một chuỗi có tất cả các chữ số (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein

Câu trả lời:


557

Bạn chỉ có thể 'thêm' các mảng:

>> $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
Hãy cẩn thận với điều này! Toán tử + không phải là một bổ sung, đó là một liên minh. Nếu các khóa không trùng nhau thì tất cả đều tốt, nhưng nếu chúng làm ...
GordonM

3
Chỉ cần wow - bạn đã tiết kiệm cho tôi những dòng mã, gần ba năm.
Stephen O'Flynn

86
Trong trường hợp bất cứ ai tự hỏi 'nếu họ làm chồng chéo thì sao?' : php.net: "Toán tử + trả về mảng bên phải được gắn vào mảng bên trái; đối với các khóa tồn tại trong cả hai mảng, các phần tử từ mảng bên trái sẽ được sử dụng và các phần tử khớp từ bên phải mảng tay sẽ bị bỏ qua. "
Flion

2
@Flion nó phức tạp hơn thế. Sử dụng '+', tôi vừa thêm hai mảng con với một phần tử có khóa chung và khóa con: các giá trị đã được thêm! 100000 => mảng (size = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => mảng (size = 1) 2 => int 30 Kết quả: 100000 => mảng (size = 3) 1 => int 128 2 => int 86 3 => int 7 Về cơ bản việc thêm [2 => 56] + [2 => 30] không thay thế giá trị mà thêm nó và trở thành [2 => 86]
Dario Fumagalli

1
@DarioFumagalli Tôi không biết liệu tôi có hiểu nhầm không hoặc nếu nó chỉ thay đổi kể từ năm 2016, nhưng tại thời điểm này, hoạt động print_r([2 => 56] + [2 => 30]);mang lại kết quả Array ( [2] => 56 ). Vì vậy, nó giữ phía bên tay trái như được chỉ định. Đây là lúc PHP 7.1.19, chạy trên repl.it .
Charles Wood

62

Xem xét rằng bạn có

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

Đang làm $merge = $replacement + $replaced;sẽ xuất ra:

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

Mảng đầu tiên từ tổng sẽ có giá trị ở đầu ra cuối cùng.

Đang làm $merge = $replaced + $replacement;sẽ xuất ra:

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

[[thumbsup]] về điều này
Jhourlad Estrella

21
Để tổng hợp, khi thêm 2 mảng, các giá trị từ các giá trị ghi đè đầu tiên từ thứ hai.
Dziamid

1
Tôi nghĩ cái thứ hai sẽ ghi đè lên cái thứ nhất. :)
Asim KT

1
Chính xác. Đó là lý do tại sao tôi không thể sử dụng $allValues += $newValues;.
MarthyM

Đang làm $merge = $replacement + $replaced;sẽ xuất ra:Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma

24

Trong khi câu hỏi này khá cũ, tôi chỉ muốn thêm một khả năng khác để thực hiện hợp nhất trong khi giữ các khóa.

Bên cạnh việc thêm khóa / giá trị vào các mảng hiện có bằng cách sử dụng +dấu hiệu bạn có thể thực hiện array_replace.

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

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

Kết quả sẽ là:

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

Các khóa tương tự sẽ được ghi đè bởi mảng sau.
Ngoài ra còn có một array_replace_recursive, làm điều này cho các chương trình con, quá.

Ví dụ trực tiếp trên 3v4l.org


3

Hai mảng có thể dễ dàng thêm hoặc kết hợp mà không cần lập chỉ mục ban đầu của chúng bằng toán tử + . Điều này sẽ rất hữu ích trong việc thả xuống laravel và codeigniter chọn.

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

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

  $arr_option = $empty_option + $option_list;

Đầu ra sẽ là:

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

1

Hãy thử các hàm Array numplace_recursive hoặc mảng numplace

$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/feft.array-replace-recursive.php

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.