获取类似对象之间的键和值的区别在PHP

获取类似对象之间的键和值的区别在PHP

问题描述:

我有两个相似的对象: 对象老:获取类似对象之间的键和值的区别在PHP

object(Party)#203 (16) { 
    ["connection":protected]=> 
    object(Connection)#202 (6) { 
    ["token":"Connection":private]=> 
    string(64) "xyzxxyzxyz" 
    ["url":"Connection":private]=> 
    string(33) "https://api.test.com" 
    ["singularAction"]=> 
    string(5) "party" 
    ["pluralAction"]=> 
    string(7) "parties" 
    ["action"]=> 
    string(5) "party" 
    } 
    ["emailAddresses"]=> 
    array(3) { 
    [0]=> 
    array(3) { 
     ["id"]=> 
     int(273530863) 
     ["type"]=> 
     NULL 
     ["address"]=> 
     string(19) "[email protected]" 
    } 
    [1]=> 
    array(3) { 
     ["id"]=> 
     int(274183291) 
     ["type"]=> 
     NULL 
     ["address"]=> 
     string(18) "[email protected]" 
    } 
    [2]=> 
    array(3) { 
     ["id"]=> 
     int(278650133) 
     ["type"]=> 
     NULL 
     ["address"]=> 
     string(26) "[email protected]" 
    } 
    } 
} 

和对象的更新:

object(Party)#201 (16) { 
    ["connection":protected]=> 
    object(Connection)#202 (6) { 
    ["token":"Connection":private]=> 
    string(64) "xyzxxyzxyz" 
    ["url":"Connection":private]=> 
    string(33) "https://api.test.com" 
    ["singularAction"]=> 
    string(5) "party" 
    ["pluralAction"]=> 
    string(7) "parties" 
    ["action"]=> 
    string(5) "party" 
    } 
    ["emailAddresses"]=> 
    array(4) { 
    [0]=> 
    array(3) { 
     ["id"]=> 
     int(273530863) 
     ["type"]=> 
     NULL 
     ["address"]=> 
     string(19) "[email protected]" 
    } 
    [1]=> 
    array(3) { 
     ["id"]=> 
     int(274183291) 
     ["type"]=> 
     NULL 
     ["address"]=> 
     string(18) "[email protected]" 
    } 
    [2]=> 
    array(3) { 
     ["id"]=> 
     int(278650133) 
     ["type"]=> 
     NULL 
     ["address"]=> 
     string(26) "[email protected]" 
    } 
    [3]=> 
    array(1) { 
     ["address"]=> 
     string(27) "[email protected]" 
    } 
    } 
} 

视觉上的差异是最后的电子邮件地址作为更新对象中的最后一个条目出现。我如何突出显示PHP的差异并抓住它? 我想检查两个对象的每个条目,找出关键和值的差异,并用它做一些事情。

我已经成功地写是这样的:

//Get the updated object.... 
     $newObject = $this; 
     //Now get the object before update was executed... 
     $oldObj = $this->oldObject; 

     //Remove object memebers from the new object for easy comparison with the old... 
     unset($newObject->oldObject, $newObject->about, $newObject->createdAt, $newObject->updatedAt, $newObject->lastContactedAt, $newObject->pictureURL); 
     //Remove object memebers from the old object.... 
     unset($oldObj->about, $oldObj->createdAt, $oldObj->updatedAt, $oldObj->lastContactedAt, $oldObj->pictureURL); 

     $varsNewObj = get_object_vars($newObject); 
     $varsOldObj = get_object_vars($oldObj); 
     //Remove further unneeded memebers.... 
     unset($varsNewObj['connection']); 
     unset($varsOldObj['connection']); 

     $arrayData = []; 

     foreach ($varsNewObj as $values) { 
      if (is_string($values) && $values != null) { 
       var_dump('New Values: ' . $values); 
      } 
      if (is_array($values)) { 
       foreach ($values as $value) { 
        if (is_string($value) && $value != null) { 
         //var_dump($value); 
        } 
        if (is_array($value)) { 
         foreach ($value as $v) { 
          if ($v != null) { 
           //var_dump($v); 
          } 
         } 
        } 
       } 
      } 
     } 

什么上面的代码所做的是让每一个需要来自新对象比较字符串。同样的原则可以应用于$ oldObj,但是我对后来如何做比较感到困惑,因为我脑海中似乎并不奏效。

+0

你可以用'get_object_vars'([手动链接](http://php.net/manual/function.get-object-vars.php))开始并比较它们。它是否必须递归? – Kaddath

+0

不幸的是。 –

+0

以及我没有时间为你编写它(而不是网站的目的),但我写了类似的JavaScript递归函数(实际上是为了找到对象结构中的特定键),如果你感兴趣可以激励你 – Kaddath

注意:这不是一个真正的答案,只是一种方法来解决他的问题,因为我没有时间来完全解释,但仍然想要帮助。你可以投票,如果你喜欢,但没有必要,这个答案可以删除,如果问题更新与提问者的尝试。

所以这是一个递归地做类似事情的基本例子。我在这里直接返回找到的元素,在这种情况下,您应该填充一个数组(如果想要将原始值和修改值的结果分开,则可以填充两个元素)。你也不应该像我那样突破,因为当你不是时,我只希望得到一个结果。

测试if('scope' in e_t){是这里的递归条件,在你的情况下,它将是一个测试值的类型,以知道你是否想更深入(数组,对象?),你没有精确什么类型你想要搜索递归的元素,如果它们全部都是,你可能不得不在类型上做出例子(不同的方式来迭代属性)。你也没有精确的输出格式,所以你必须这样做。

的例子:

  function _recursiveSearch(scope, objId, identifier){ 
       var scope_t = scope, e_t, k_t, r_t = false; 
       for(k_t in scope_t){ 
        if(scope_t.hasOwnProperty(k_t)){ 
         e_t = scope_t[k_t]; 
         if(identifier in e_t && e_t[identifier] === objId){ 
          return e_t; 
         } 
         if('scope' in e_t){ 
          r_t = _recursiveSearch(e_t.scope, objId, identifier); 
          if(r_t !== false){ 
           break; 
          } 
         } 
        } 
       } 
       return r_t; 
      } 

编辑PHP:还有我忘了提棘手的部分,要小心,===与PHP对象将比较他们的参考。如果要比较属性名称及其值,请使用==。对于方法论来说,确保不要因为它们不相同而将2个属性记录为不同,因为如果它们是对象,它们可能是它们的内部属性之一,事实上并非如此简单!

+0

感谢您的信息,但我仍然无法弄清楚正确的方法。出于某种原因或其他原因,比较不总是正确执行。 –

+0

@ ao-pack我编辑了您的评论,在某一时刻,您还应该使用您编写的代码编辑您的问题,这将对人们更容易帮助 – Kaddath

+0

我更新了一些问题。如果你能看一看,并指向我认为合适的方式,那就太好了。我知道可能有什么不对,但现在我没办法做得更好,因为我没有太多经验。 –