2011-07-03 34 views
6

tôi muốn hợp nhất hai mảng với nhau:Làm cách nào để hợp nhất hai mảng bằng cách tiếp nhận các giá trị duy nhất từ ​​mảng thứ hai có cùng khóa với mảng đầu tiên?

$filtered = array(1 => 'a', 3 => 'c'); 
$changed = array(2 => 'b*', 3 => 'c*'); 

Trong khi merge nên bao gồm tất cả các yếu tố của $filtered và tất cả những yếu tố của $changed rằng có một phím tương ứng trong $filtered:

$merged = array(1 => 'a', 3 => 'c*'); 

array_merge($filtered, $changed) cũng sẽ thêm các phím bổ sung của $changed vào $filtered. Vì vậy, nó không thực sự phù hợp.

Tôi biết rằng tôi có thể sử dụng $keys = array_intersect_key($filtered, $changed) để lấy các khóa tồn tại trong cả hai mảng đã là một nửa công việc.

Tuy nhiên tôi tự hỏi nếu có bất kỳ (bản địa) chức năng có thể làm giảm mảng $changed thành một mảng với $keys được chỉ định bởi array_intersect_key? Tôi biết tôi có thể sử dụng array_filter với chức năng gọi lại và kiểm tra $keys trong đó, nhưng có thể có một số hàm thuần túy thuần túy khác chỉ trích xuất các phần tử đó từ một mảng trong đó các khóa có thể được chỉ định?

Tôi hỏi vì các hàm gốc thường nhanh hơn nhiều so với array_filter với gọi lại.

Trả lời

13

này nên làm điều đó, nếu tôi hiểu logic của bạn một cách chính xác:

array_intersect_key($changed, $filtered) + $filtered 

Thực hiện:

$filtered = array(1 => 'a', 3 => 'c'); 
$changed = array(2 => 'b*', 3 => 'c*'); 
$expected = array(1 => 'a', 3 => 'c*');  
$actual = array_key_merge_deceze($filtered, $changed); 

var_dump($expected, $actual); 

function array_key_merge_deceze($filtered, $changed) { 
    $merged = array_intersect_key($changed, $filtered) + $filtered; 
    ksort($merged); 
    return $merged; 
} 

Output:

Expected: 
array(2) { 
    [1]=> 
    string(1) "a" 
    [3]=> 
    string(2) "c*" 
} 

Actual: 
array(2) { 
    [1]=> 
    string(1) "a" 
    [3]=> 
    string(2) "c*" 
} 
+0

Liên kết với giao lộ. Nhưng công đoàn sẽ thêm khóa '$ filtering' cũng như AFAIK. Tôi sẽ thử. – hakre

+0

Tôi nghĩ rằng việc thêm các phím của '$ lọc' là điểm ...? – deceze

+0

Jup. Tôi chỉ thử nghiệm nó, lỗi của tôi;). Nó hoạt động khá tốt, chỉ thứ tự của các phím thay đổi, nhưng đó không phải là vấn đề khi tôi có chúng như là một chỉ số, vì vậy ksort thực hiện công việc. Hoàn hảo. Cảm ơn rất nhiều! – hakre

0

nếu bạn muốn mảng thứ hai ($ b) là mẫu indica rằng nếu chỉ có khóa ở đó, thì bạn cũng có thể thử số này

$new_array = array_intersect_key($filtered, $changed) + $changed; 
Các vấn đề liên quan