2011-06-24 32 views
21

Tôi biết có array_diffarray_udiff để so sánh sự khác biệt giữa hai mảng, nhưng làm cách nào tôi làm điều đó với hai mảng đối tượng?PHP nhận được sự khác biệt của hai mảng đối tượng

array(4) { 
    [0]=> 
     object(stdClass)#32 (9) { 
      ["id"]=> 
      string(3) "205" 
      ["day_id"]=> 
      string(2) "12" 
     } 
} 

mảng của tôi giống như thế này, tôi quan tâm thấy sự khác biệt của hai mảng dựa trên ID.

Trả lời

53

Đây chính xác là những gì array_udiff dành cho. Viết một hàm so sánh hai đối tượng theo cách bạn muốn, sau đó yêu cầu array_udiff sử dụng chức năng đó. Một cái gì đó như thế này:

function compare_objects($obj_a, $obj_b) { 
    return $obj_a->id - $obj_b->id; 
} 

$diff = array_udiff($first_array, $second_array, 'compare_objects'); 

Hoặc, nếu bạn đang sử dụng PHP> = 5.3 bạn chỉ có thể sử dụng một anonymous function thay vì định nghĩa một hàm:

$diff = array_udiff($first_array, $second_array, 
    function ($obj_a, $obj_b) { 
    return $obj_a->id - $obj_b->id; 
    } 
); 
+0

chức năng so sánh của bạn sẽ không hoạt động, một sửa chữa nhanh chóng sẽ được thay đổi '== 'để' -' . – salathe

+1

Đúng vậy, bạn đang ở đây. Đã sửa. –

+0

Cảm ơn bạn, đó là '-' đã ném tôi đi. – roflwaffle

4

Dưới đây là một lựa chọn khác, nếu bạn muốn chạy sự khác biệt theo đối tượng trường hợp. Bạn sẽ sử dụng điều này như callback của bạn để array_udiff:

function compare_objects($a, $b) { 
    return strcmp(spl_object_hash($a), spl_object_hash($b)); 
} 

Bạn chỉ muốn sử dụng rằng nếu bạn chắc chắn rằng các mảng cả chỉ chứa các đối tượng - here's my personal use case.

+0

và điều gì về 'return $ a === $ b? 0: -1'? Nó sẽ không làm điều tương tự bằng cách so sánh các biến đối tượng trỏ đến cùng một cá thể đối tượng? –

1

Và đây là một lựa chọn khác nếu bạn muốn so sánh các thuộc tính chuỗi (ví dụ tên):

$diff = array_udiff($first_array, $second_array, 
    function ($obj_a, $obj_b) { 
    return strcmp($obj_a->name, $obj_b->name); 
    } 
); 
Các vấn đề liên quan