除了一个属性,比较两个对象? PHP

时间:2017-03-15 15:44:27

标签: php object properties compare

我试图比较两个对象,看看它们是否相同。在这样做时,我需要忽略其中一个属性。

这是我目前的代码:

$exists = array_filter($this->products, function($stored, $key) use ($item) {
    return ($stored == $item);
}, ARRAY_FILTER_USE_BOTH);

这将比较完全相同的对象。我需要暂时从quantity

中删除$stored的媒体资源

1 个答案:

答案 0 :(得分:0)

由于这是一个对象的数组,如果你有unset属性,它不会仅在array_filter的上下文中取消设置属性。由于数组包含object identifiers,因此实际上会从$this->products中的对象中删除属性。如果你想暂时删除一个属性进行比较,只需在取消设置之前保存它的副本,然后进行比较,然后在返回比较结果之前将其添加回对象。

$exists = array_filter($this->products, function($stored, $key) use ($item) {
    $quantity = $stored->quantity;      // keep it here
    unset($stored->quantity);           // temporarily remove it
    $result = $stored == $item;         // compare
    $stored->quantity = $quantity;      // put it back
    return $result;                     // return
}, ARRAY_FILTER_USE_BOTH);

另一种可能性是克隆对象并从克隆中取消设置属性。根据对象的复杂程度,这可能效率不高。

$exists = array_filter($this->products, function($stored, $key) use ($item) {
    $temp = clone($stored);
    unset($temp->quantity);
    return $temp == $item;
}, ARRAY_FILTER_USE_BOTH);