2011-05-06 172 views
12
顯示DIFF

我在尋找一個方式給我看不同的屬性/值從給定的對象......比較對象的屬性和在PHP

$obj1 = new StdClass; $obj1->prop = 1; 
$obj2 = new StdClass; $obj2->prop = 2; 

var_dump(array_diff((array)$obj1, (array)$obj2)); 
//output array(1) { ["prop"]=> int(1) } 

這工作得很好,只要財產是不是對象或數組。

$obj1 = new StdClass; $obj1->prop = array(1,2); 
$obj2 = new StdClass; $obj2->prop = array(1,3); 

var_dump(array_diff((array)$obj1, (array)$obj2)) 
// Output array(0) { } 
// Expected output - array { ["prop"]=> array { [1]=> int(2) } } 

有沒有辦法擺脫這一點,即使當屬性是另一個對象?!

+0

通常你在類的方法解決這個問題,就像一個'等於($對象)'方法。也許你不能修改課程? – 2011-05-06 12:15:53

+1

哦,當比較包含對象的屬性時,你如何看待對象是相等的?這是一種遞歸問題......您可以檢查它們的屬性是否相等(遞歸問題...)或者它們是否是相同的實例(比平等更強)。 – 2011-05-06 12:17:20

+1

是您正在測試的確切的一個以上的代碼?如果是這樣,那麼$ obj1和$ obj2的prop是相同的數組(1,2)。技術上確實沒有區別。 – dragonjet 2011-05-07 07:37:21

回答

4

類似下面,它迭代通過並執行遞歸差異是數組中的項目本身就是一個數組可以工作:

德相似的工作和array_diff,但它確實檢查,看它是否是數組first(is_array),如果是,則將該鍵的diff設置爲該數組的diff。以遞歸方式重複。

function recursive_array_diff($a1, $a2) { 
    $r = array(); 
    foreach ($a1 as $k => $v) { 
     if (array_key_exists($k, $a2)) { 
      if (is_array($v)) { 
       $rad = recursive_array_diff($v, $a2[$k]); 
       if (count($rad)) { $r[$k] = $rad; } 
      } else { 
       if ($v != $a2[$k]) { 
        $r[$k] = $v; 
       } 
      } 
     } else { 
      $r[$k] = $v; 
     } 
    } 
    return $r; 
} 

然後,它的工作原理是這樣的:

$obj1 = new StdClass; $obj1->prop = array(1,2); 
$obj2 = new StdClass; $obj2->prop = array(1,3); 
print_r(recursive_array_diff((array)$obj1, (array)$obj2)); 

/* Output: 
    Array 
    (
     [prop] => Array 
      (
       [1] => 2 
      ) 
    ) 
*/ 
+0

這幾乎是我想要的,它不起作用,如果$ obj-> prop是另一個數組作爲屬性的對象..但我會保持那作爲最佳的答案。 – nfo 2011-05-09 07:06:39

+0

在這種情況下,你可以添加到你的循環的東西,檢查是否對象是不是數組,不管你是否可以將其轉換爲一個數組,並對其運行recursive_array_diff。 – 2011-05-09 12:02:18

+0

類似if(is_array($ v)){...} elseif(is_array((array)$ v){...} else {...} 您可能需要檢查cast數組來檢查你是不是無意的投射值。讓我知道如果你工作的東西:) – 2011-05-09 12:03:53