我是编程的新手,想知道是否有一种简短的方法可以找到包含略微不同的对象的两个数组的交集。这就是我尝试使用的内容:
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;
首先,我得到一个空数组
答案 0 :(得分:1)
您不是在寻找与此处不同类型相同的对象,即 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
。