php 略有不同的对象数组的交集
php intersection of array of slightly different objects
我是编程新手,想知道是否有一种简短的方法可以找到包含略有不同对象的两个数组的交集。这就是我尝试使用的:
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;
首先我得到一个空数组
你不是在寻找相同的对象,因为你在这里有不同的类型,即 object1 和 object2.
相反,您正在寻找相似的 对象,在这些对象中您正在寻找客户 ID 和订单 ID 相同的对象。
这一点很重要,因为您只能说比较不属于这两种类型中的任何一种,因为您可以将比较放入两者中,object1 和 object2.
在这种情况下,您无法清楚地识别某个功能属于哪个对象类型,一个好的经验法则是将它放在这些对象之间,例如为操作本身创建一个函数或它自己的新类型。
这是一个设计决策。
现在谈谈如何使不同对象的这种比较变得容易?一种方法是使用 散列函数 .
假设这两个 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
。
我是编程新手,想知道是否有一种简短的方法可以找到包含略有不同对象的两个数组的交集。这就是我尝试使用的:
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;
首先我得到一个空数组
你不是在寻找相同的对象,因为你在这里有不同的类型,即 object1 和 object2.
相反,您正在寻找相似的 对象,在这些对象中您正在寻找客户 ID 和订单 ID 相同的对象。
这一点很重要,因为您只能说比较不属于这两种类型中的任何一种,因为您可以将比较放入两者中,object1 和 object2.
在这种情况下,您无法清楚地识别某个功能属于哪个对象类型,一个好的经验法则是将它放在这些对象之间,例如为操作本身创建一个函数或它自己的新类型。
这是一个设计决策。
现在谈谈如何使不同对象的这种比较变得容易?一种方法是使用 散列函数 .
假设这两个 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
。