2011-06-24 63 views
21

我知道有array_diffarray_udiff用於比較兩個數組之間的差異,但是如何用兩個對象數組來做這件事?PHP獲得兩個對象數組的差異

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

我的數組就像這樣,我很想看到兩個基於ID的數組的區別。

回答

53

這正是array_udiff的用途。編寫一個函數,以您想要的方式比較兩個對象,然後告訴array_udiff使用該函數。事情是這樣的:

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

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

或者,如果你使用PHP> = 5.3,你可以只使用一個anonymous function代替聲明功能:

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

你比較功能將無法正常工作,速戰速決是改變了''==到'-' 。 – salathe

+1

對,你好。固定。 –

+0

謝謝你,這是''扔掉了我。 – roflwaffle

4

這裏的另一種選擇,如果你想運行根據對象實例的差異。你可以使用這個作爲你的回調array_udiff

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

你只需要使用該陣列都只有包含對象,如果你是肯定的 - here's my personal use case

+0

以及'return $ a === $ b? 0:-1'?難道通過比較指向同一個對象實例的對象變量來做同樣的事情嗎? –

1

這裏是另一種選擇,如果你想比較字符串屬性(如姓名):

$diff = array_udiff($first_array, $second_array, 
    function ($obj_a, $obj_b) { 
    return strcmp($obj_a->name, $obj_b->name); 
    } 
); 
相關問題