gpt4 book ai didi

php - 如何计算对象数组与自定义比较函数的交集?

转载 作者:搜寻专家 更新时间:2023-10-31 20:56:55 25 4
gpt4 key购买 nike

我有两个对象数组,我需要获取两个数组中都存在的对象数组,并将它们与自定义回调函数进行比较。这是我的代码:

<?php
class Some {
public $prop1;
public $prop2;

public function __construct($prop1, $prop2)
{
$this->prop1 = $prop1;
$this->prop2 = $prop2;
}
}

$arr1 = [new Some(1, 2), new Some(2, 3), new Some(3, 4)];
$arr2 = [new Some(2, 3), new Some(1, 2)];

$intersection = array_uintersect($arr1, $arr2, function ($el1, $el2) {
return ($el1->prop1 === $el2->prop1) && ($el1->prop2 === $el2->prop2) ? 0 : 1;
});

print_r($intersection);

我得到的是:

Array ( [1] => Some Object ( [prop1] => 2 [prop2] => 3 )

)

虽然我显然想要获得两个 Prop 相同的对象((1、2)和(2、3)。

这个不相交有什么问题?如何实现我所需要的?

最佳答案

Intersect 函数首先对数组进行排序,因此您需要了解一个对象比另一个对象少,并返回 -1、0、1 作为比较结果。否则,如果您只能回答对象是否相等,则应该扫描第二个数组以获取第一个数组的每个项目 – splash58 13 分钟前。现在代码的结果取决于数组中对象的顺序

要使用相交函数,您可以创建一个函数来比较两个对象,如下所示

class Some {
public $prop1;
public $prop2;

static function compare($el1, $el2) {
$r = $el1->prop1 - $el2->prop1;
return $r ? $r : ($el1->prop2 - $el2->prop2);
}


public function __construct($prop1, $prop2)
{
$this->prop1 = $prop1;
$this->prop2 = $prop2;
}
}

$arr1 = [new Some(1, 2), new Some(2, 3), new Some(3, 4)];
$arr2 = [new Some(2, 3), new Some(1, 2)];

$intersection = array_uintersect($arr1, $arr2, ['Some','compare']);

print_r($intersection);

demo

更新

如果您不想使函数比较对象,PHP 本身会检查这些对象是否相等。所以你可以使用带有 in_array 函数的简单代码

$intersection = array();
foreach($arr1 as $x) {
if (in_array($x, $arr2)) {
$intersection[] = $x;
}
}
print_r($intersection);

关于php - 如何计算对象数组与自定义比较函数的交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57373251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com