2013-07-04 7 views
41

Tôi có hai mảng:Làm cách nào để hợp nhất mảng và giữ phím?

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 

Tôi muốn kết hợp chúng và giữ các phím và trình tự, không tái-index !!

Làm thế nào để có được như thế này?

Array 
(
    [a] => new value 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [123] => 456 
) 

tôi cố gắng array_merge() nhưng nó sẽ không được giữ các phím:

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

Array 
(
    [a] => 'new value' 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [0] => 456 
) 

Tôi cố gắng để các nhà điều hành công đoàn nhưng nó sẽ không ghi đè lên rằng yếu tố:

print_r($array1 + $array2); 

Array 
(
    [a] => 1 <-- not overwriting 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [123] => 456 
) 

Tôi cố gắng đổi chỗ nhưng trật tự là sai, không phải nhu cầu của tôi:

print_r($array2 + $array1); 

Array 
(
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [a] => new value 
    [123] => 456 
    [b] => 2 
    [c] => 3 
) 

Tôi không muốn sử dụng vòng lặp, có cách nào cho hiệu suất cao không?

+0

Dont bạn chỉ cần lật thứ tự của mảng merge của bạn ? array_merge ($ array2, $ array1); –

+2

Vấn đề với array_merge() là nó nhìn thấy phím '" 123 "', và diễn giải nó như là số, mà được reindexed. – jcsanyi

Trả lời

106

Bạn đang tìm kiếm array_replace():

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 
print_r(array_replace($array1, $array2)); 

Có sẵn từ PHP 5.3.

Cập nhật

Bạn cũng có thể sử dụng sự kết hợp array operator; nó hoạt động cho các phiên bản cũ và thực sự có thể nhanh hơn quá:

print_r($array2 + $array1); 
+1

@joe Bạn được chào đón.Tất nhiên, vẫn còn một vòng lặp, sự khác biệt là nơi nó diễn ra :) –

+0

Giải pháp của tôi sẽ hoạt động như một bản vá khỉ trước 5.3 cho chức năng đó – Orangepill

-1

Tôi nghĩ rằng điều này có thể giúp đỡ nếu tôi hiểu đúng:

foreach ($i = 0, $num = count($array2); $i < $num; $i++) 
{ 
    $array = array_merge($array1, $arrar2[$i]); 
} 
3

@Jack phát hiện chức năng bản địa mà có thể làm điều này, nhưng vì nó là chỉ có sẵn trong php 5.3 và ở trên này nên làm việc bắt chước này chức năng trên trước 5.3 cài đặt

if(!function_exists("array_replace")){ 
     function array_replace(){ 
     $args = func_get_args(); 
     $ret = array_shift($args); 
     foreach($args as $arg){ 
      foreach($arg as $k=>$v){ 
       $ret[(string)$k] = $v; 
      } 
     } 
     return $ret; 
    } 
} 
+0

Tôi không muốn sử dụng vòng lặp, có cách nào cho hiệu suất cao không? – Jasper

+0

Tôi không thể nghĩ ra cái nào sẽ đáp ứng yêu cầu của các phím số. Không tính ra giải pháp mặc dù, tôi không nghĩ rằng vòng lặp sẽ dẫn đến hiệu suất hút mà bạn tưởng tượng nó sẽ. – Orangepill

+0

Được rồi, nhưng cảm ơn bạn rất nhiều. – Jasper

2

array_replace_recursive() hoặc array_replace() là chức năng bạn đang tìm kiếm

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 


var_dump(array_replace_recursive($array1, $array2)); 

Demo