【问题标题】:php intersection of array of slightly different objectsphp交集的数组略有不同的对象
【发布时间】:2017-11-15 19:19:24
【问题描述】:

我是编程新手,想知道是否有一种捷径可以找到两个包含稍微不同对象的数组的交集。这就是我尝试使用的:

array_uintersect()

对象看起来像这样:

class object1 
{
private $_customerId;
private $_orderId;
private $_someOtherStuff;
}

和:

class object2 
{
private $_customerId;
private $_orderId;
private $_someDifferentStuff;
}

自定义函数如下所示:

private function compareObjects($o1, $o2)
        {  
            return $o1->compareObjectIntersection($o2);;
        }

使用这种方法:

 public function compareObjectIntersection($object)
        {
            if($this->_customerId < $object->getCustomerId() || $this->_orderId < $object->getOrderId())
            {
                return -1;
            }
            elseif$this->_customerId > $object->getCustomerId() || $this->_orderId > $object->getOrderId())
            {
                return 1;
            }
            return 0;
        }

如果不用自己用大量的 for 循环编写所有内容,这是否可能?


编辑:

这个想法是摆脱所有不包含这两个属性的相同对的对象:

private $_customerId; 
private $_orderId; 

首先我得到一个空数组

【问题讨论】:

  • 就数据而言,这些对象包含什么内容,您将从上面的对象中得到什么结果???
  • 包含不同内容的对象,主要是整数和字符串。重点是前两个属性。这个想法是摆脱所有不包含这两个属性的同一对的对象: private $_customerId;私人 $_orderId;首先,我得到一个空数组。
  • 毛伊岛,而不是将标题更改为“已解决”,在 Stack Overflow 上,您应该将正确答案标记为“已接受”(答案分数下方的绿色刻度线)。 :)
  • 非常感谢domdom。我会尽快改的

标签: php arrays array-intersect


【解决方案1】:

您不是在寻找相同的对象,因为这里有不同的类型,即 object1object2

相反,您正在寻找 相似 对象,在这些对象中您正在寻找与 customer-ID 和 order-ID 相同的对象。

这很重要,因为您可以说比较不属于这两种类型中的任何一种,因为您可以将比较放在 object1对象2.

在这种情况下,您无法清楚地识别功能属于哪个对象类型,一个好的经验法则是将其放置在 这些对象之间,例如为操作本身创建一个函数或它自己的新类型。

设计决策。

现在关于如何使不同对象的这种比较变得容易?一种方法是使用 散列函数

假设这两个 ID 是整数,您可以使用散列函数为这些不同的对象中的每一个创建一个 散列

function customer_order_hash($object) {
    return sprintf('%d/%d', $object->getCustomerId(), $object->getOrderId());
}

这个哈希现在可以很容易地识别相同或不同的对象:哈希将是相同的。

然后您可以使用它,例如从$array1 获取所有在$array2 中有对应对象的对象:

function compare_objects($a, $b) {
    return strcmp(customer_order_hash($a), customer_order_hash($b));
}

$result = array_uintersect($array1, $array2, 'compare_objects');

然后,结果仅包含第一个数组中的这些对象,这些对象也通过第二个数组中的这种比较找到。

如您所见,根本没有(书面)循环。只有一个哈希函数和一个使用它的比较函数。

对象散列函数通常适用于此类比较(相同或不同)。它也可以用于排序,但是此示例不适用于排序。

附加信息:PHP 中内置的对象散列函数是spl_object_hash

【讨论】:

  • 非常感谢。这看起来是最好的答案。我今晚试试。 @hakre
  • 是的,请尝试。我不知道这是否是针对您的问题的最佳建议,因为我没有完全从问题中完全理解 array_uintersect 到底是什么。但是,使用对象散列函数可以索引对象列表,然后更轻松地进行比较。 en.wikipedia.org/wiki/Hash_function - 关于将对象分开的建议,我可以给出的另一个提示是关于继承的组合 - en.wikipedia.org/wiki/Composition_over_inheritance - 为了在您自己的代码中支持这一点,您可以例如引入一个 object1/2 都实现的接口。跨度>
  • 我使用这个的问题稍微复杂一些。这些对象代表来自数据库的数据。这些的交集是所有条目(DB),应该与 .I'm 不确定我是否必须为此创建一个新帖子,或者是否可以在此处发布。问题本身是,我在不同的服务器上有 2 个数据库,一个是 MySQL,一个是 sqlite,需要使它们保持同步。我需要更多的空间来解释它。我想今晚还有更多,因为我直到今天晚上都在学校。
  • 您拥有跨不同数据源的实现特定身份,这些数据源拥有自己的身份。最好将其与用于从数据库中检索数据的数据对象分开。如果它很复杂,请考虑使用接口。这有助于您保持与操作无关的代码更易于维护。
  • 我试过了,效果很好。非常感谢。我会考虑使用更多接口。
猜你喜欢
  • 2019-09-28
  • 1970-01-01
  • 2023-01-17
  • 2011-02-19
  • 1970-01-01
  • 2016-11-19
  • 2017-11-28
  • 1970-01-01
  • 2021-09-24
相关资源
最近更新 更多