2010-05-21 50 views
7

Tôi có này hai mảng:Hãy so sánh hai mảng kết hợp và tạo ra một mảng mới với các mảng phù hợp, PHP

$arr1=array( array("id" => 8, "name" => "test1"), 
       array("id" => 4, "name" => "test2"), 
       array("id" => 3, "name" => "test3") 
      ); 

$arr2=array( array("id" => 3), 
       array("id" => 4) 
      ); 

Làm thế nào tôi có thể "khai thác" các mảng từ $ arr1, nơi id có cùng một giá trị trong $ arr2 , vào một mảng mới và để mảng được trích xuất cũng trong một mảng mới, mà không tính đến các lệnh khóa chính?

Sản lượng tôi đang tìm kiếm nên là:

$arr3=array(
       array("id" => 8, "name" => "test1") 
      ); 

$arr4=array( array("id" => 4, "name" => "test2"), 
       array("id" => 3, "name" => "test3") 
      ); 

Cảm ơn

Trả lời

6

tôi chắc chắn rằng có một số chức năng mảng huyền diệu làm sẵn sàng có thể xử lý này, nhưng đây là một ví dụ cơ bản:

$ids = array(); 
foreach($arr2 as $arr) { 
    $ids[] = $arr['id']; 
} 

$arr3 = $arr4 = array(); 
foreach($arr1 as $arr) { 
    if(in_array($arr['id'], $ids)) { 
     $arr4[] = $arr; 
    } else { 
     $arr3[] = $arr; 
    } 
} 

Đầu ra sẽ giống như kết quả bạn mong muốn. Live dụ:

http://codepad.org/c4hOdnIa

+0

Thực tế nó hoạt động hoàn hảo, xuất ra những gì tôi cần. Cảm ơn bạn. Tôi cũng chắc chắn rằng có một chức năng sẵn sàng thực hiện mảng để sử dụng, tôi đã cố gắng nhưng không thể có được kết quả. Cảm ơn bạn một lần nữa, tôi sẽ sử dụng mã của bạn. – tdecs

3

Bạn có thể sử dụng array_udiff()array_uintersect() với một chức năng so sánh tùy chỉnh.

function cmp($a, $b) { 
    return $a['id'] - $b['id']; 
} 

$arr3 = array_udiff($arr1, $arr2, 'cmp'); 
$arr4 = array_uintersect($arr1, $arr2, 'cmp'); 

Tôi đoán điều này có thể sẽ chậm hơn câu trả lời khác vì điều này sẽ vượt qua mảng hai lần.

Các vấn đề liên quan