2016-10-21 114 views
1

我有兩個這樣的對象。比較兩個PHP對象 - PHP和OBJECTS

$陣列1

stdClass Object ( 
    [BellId] => 2 
    [BellCode] => BP001 
    [BellDescription] => SPI SPEED ABNORMAL,CHK BELT 
    [ControllerId] => 3 
    [CreatedBy] => 1 
    [CreatedOn] => 2016-08-19 15:09:25 
    [ModifiedBy] => 
    [ModifiedOn] => 
) 

$數組2

stdClass Object ( 
    [BellId] => 1 
    [BellCode] => BP002 
    [BellDescription] => MCB TRIPPED,CHK MTR SHORT,O/L. 
    [ControllerId] => 3 
    [CreatedBy] => 1 
    [CreatedOn] => 2016-08-19 15:09:25 
    [ModifiedBy] => 
    [ModifiedOn] => 
) 

我需要比較這個對象,並得到僅在這兩個對象的區別。

我檢查了下面的鏈接,但沒有用。

Comparing two stdClass Objects

Comparing 2 objects PHP

我的示例代碼如下所示

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; 
} 

有人可以幫助我的代碼。

+0

您可以檢查這個答案,這似乎是使用相同的功能,你http://stackoverflow.com/questions/5911067/compare-object-屬性和顯示差異在PHP中/ 5922429#5922429 –

+0

我已經發布了一個答案,但我想問你爲什麼要在你的代碼中做遞歸比較?您指定的對象示例只有一個深度。 –

回答

0

首先這兩個對象轉換爲數組:

$arrayA = (array)$objectA; 
$arrayB = (array)$objectB; 

那麼就使用和array_diff得到陣列之間的差異

$difference = array_diff($arrayA, $arrayB); 

這將返回一個包含從第一個數組中的鍵數組($ arrayA)以及它們的值,其中給出兩個對象之間的哪些字段不同的指示

foreach($difference as $key => $diff) { 
    echo $objectA->$key; 
    echo $objectB->$key; 

    // the above two values will be different 
} 

注意:如果您知道兩個對象中的字段順序相同,則可以使用array_diff,但這裏最好使用array_diff_assoc,因爲這提供了額外的索引檢查。

+0

甚至可能是'$ difference =(object)array_diff((array)$ objectA,(array)$ objectB);'在一行中獲取diff對象。 – Dencker

1

使用array_diff_assoc();例如:

<?php 

$foo = new stdClass(); 
$foo->BellId = 1; 
$foo->BellDescription = 'foo'; 
$foo->CreatedBy = 1; 

$bar = new stdClass(); 
$bar->BellId = 2; 
$bar->BellDescription = 'bar'; 
$bar->CreatedBy = 1; 

$diff = array_diff_assoc((array) $foo, (array) $bar); 

print_r($diff); 

array_diff_assoc執行附加索引檢查的數組的差異。在你的情況下,這是必需的,因爲你想執行一個鍵/值差異,而不是單獨的值的差異。

上面的代碼率:

Array 
(
    [BellId] => 1 
    [BellDescription] => foo 
) 

注意:您可以透明地投出stdClass()一個實例的array,反之亦然:

$arr = ['id' => 1]; 
$obj = (object) $arr; 
$arr = (array) $obj; 

// etc. 

希望這有助於:)

0

隨着array_udiff_assoc您可以根據需要使用回調來比較項目。當然,你需要將對象轉換爲數組:

$d = array_udiff_assoc((array)$array1, (array)$array2, function ($x, $y) { 
    if (! (is_scalar($x) && is_scalar($y))) { 
    trigger_error("skipping non-scalar members!", E_USER_WARNING); 
    // you might want to handle this in the app-specific way 
    } 

    if (is_numeric($x) && is_numeric($y)) 
    return $x - $y; 

    return strcmp($x, $y); 
}); 
var_dump($d); 

其中$x$y是從陣列中的項目進行比較。

樣本輸出

array(3) { 
    ["BellId"]=> 
    int(2) 
    ["BellCode"]=> 
    string(5) "BP001" 
    ["BellDescription"]=> 
    string(27) "SPI SPEED ABNORMAL,CHK BELT" 
} 

這是一種非常靈活的方式。您可以將自己的比較邏輯放入回調中。例如,你可能要比較的類的實例:

static $date_fmt = 'YmdHis'; 

    if ($x instanceof DateTime) 
    $x = $x->format($date_fmt); 
    if ($y instanceof DateTime) 
    $y = $y->format($date_fmt);