2015-01-06 51 views
2

有沒有人知道一個php函數會接受兩個對象並返回一組完整的差異作爲對象?PHP綜合對象差異函數

我會使用JSON編碼數據的什麼,我試圖完成一個例子:

對象A:

{ 
    "Name":"Original", 
    "Id": 5, 
    "Data":{ 
     "Value1": 1, 
     "Value2": [ 
      5, 7, 8, 10 
     ], 
     "Value3": { 
      "Exists": true 
     } 
    } 
} 

對象B:

{ 
    "Name":"ThisNameChanged", 
    "Id": 5, 
    "Data":{ 
     "Value1": 7, 
     "Value2": [ 
      5, 8, 9 
     ], 
     "Value3": { 
      "Exists": true 
     } 
    } 
} 

將返回:如果不是這樣的功能存在(我猜可能),我怎麼可以寫一個功能來做到這一點?任何人都可以提供一個例子或功能?

+1

通過「全面」你是否也意味着對象類型?因此,如果兩個對象具有完全相同的值但是具有兩種不同類型,它們是否應該被視爲不同?那麼從同一個基類繼承的對象呢?他們應該被認爲是一樣的嗎?關於無法訪問的成員呢?他們應該被忽略嗎?使用遞歸可以很容易地解決這個問題,但是您必須根據「差異」來表達您的意思。 –

+0

在這種情況下,它不會關心對象的類型是什麼,或者它是否擴展任何對象。不可訪問的成員也應該被忽略,它應該只比較對象的公開可見參數。遞歸確實是我想到的。 – Zerkeras

回答

0

感謝金亞歷山大,我能夠編寫一個代碼來完成我期待的任務。

function objDiff($obj1, $obj2, $diff = null) { 
    if (is_null($diff)) 
     $diff = new stdClass; 

    $obj1Arr = (array)$obj1; 
    $obj2Arr = (array)$obj2; 

    foreach($obj1Arr as $key => $val) { 
     if (isset($obj2Arr[$key])) 
     { 
      if ($obj2Arr[$key] != $val) 
      { 
       if (is_object($obj2Arr[$key]) && is_object($val)) 
        $diff->$key = objDiff($val, $obj2Arr[$key]); 
       else 
        $diff->$key = $obj2Arr[$key]; 
      } 
     } 
    } 
    return $diff; 
} 
1

這裏是你要求的功能有些簡單的例子,

,但它並非十全十美,只是深思您:

function objDiff ($obj1, $obj2) { 
     $diff=array(); 
    $obj1Arr = (array)$obj1; 
    $obj2Arr = (array)$obj2; 

    foreach ($obj1Arr as $key=>$val) { 

     if (!(isset($obj2Arr[$key]) && $obj2Arr[$key]===$val )) { 
      if (gettype($val)=='object') { 

       if (isset($obj2Arr[$key])) { 
        if (gettype($obj2Arr[$key])=='object') { 
         $subDiff = objDiff($val,$obj2Arr[$key]); 
         $diff[$key]=$subDiff; 
        } else { 
         $diff[$key]=array($val,$obj2Arr[$key]); 
        } 
       } else { 
        $diff[$key]=array($val,$obj2Arr[$key]); 
       } 
      } else { 
       $diff[$key]=array($val,(isset($obj2Arr[$key]))?$obj2Arr[$key]:null); 
      } 
     } 
    } 
    return $diff; 
} 

與此數據:

$obj1 = new stdClass(); 
    $obj1->test1 = 1; 
    $obj1->test2 = 2; 
     $subObj = new stdClass(); 
    $subObj->test1 = 1; 
    $subObj->test2 = 2; 
    $obj1->test3 = $subObj; 
     $obj2 = new stdClass(); 
    $obj2->test1 = 3; 
    $obj2->test2 = 4; 
    $subObj = new stdClass(); 
    $subObj->test1 = 3; 
    $subObj->test2 = 2; 
    $obj2->test3 = $subObj; 

print_r(objDiff($obj1,$obj2)); 

它返回:

Array 
(
    [test1] => Array 
     (
      [0] => 1 
      [1] => 3 
     ) 

    [test2] => Array 
     (
      [0] => 2 
      [1] => 4 
     ) 

    [test3] => Array 
     (
      [test1] => Array 
       (
        [0] => 1 
        [1] => 3 
       ) 

     ) 

) 
+0

謝謝,這不是我所需要的,但我可以依靠你在這裏給我的東西來獲得我需要的東西。 – Zerkeras