对象array_unique?

2022-08-30 07:40:51

有没有像对象array_unique这样的方法?我有一堆带有“Role”对象的数组,然后我想取出重复项:)


答案 1

array_unique使用SORT_REGULAR处理对象数组:

class MyClass {
    public $prop;
}

$foo = new MyClass();
$foo->prop = 'test1';

$bar = $foo;

$bam = new MyClass();
$bam->prop = 'test2';

$test = array($foo, $bar, $bam);

print_r(array_unique($test, SORT_REGULAR));

将打印:

Array (
    [0] => MyClass Object
        (
            [prop] => test1
        )

    [2] => MyClass Object
        (
            [prop] => test2
        )
)

在此处查看其实际效果:http://3v4l.org/VvonH#v529

警告:它将使用“==”比较,而不是严格比较(“===”)。

因此,如果要删除对象数组中的重复项,请注意它将比较每个对象属性,而不是比较对象标识(实例)。


答案 2

好吧,array_unique() 比较了元素的字符串值:

注意:当且仅当字符串表示形式相同时,将使用第一个元素时,两个元素被视为相等。(string) $elem1 === (string) $elem2

因此,请确保在类中实现__toString()方法,并且它为相等的角色输出相同的值,例如

class Role {
    private $name;

    //.....

    public function __toString() {
        return $this->name;
    }

}

如果两个角色具有相同的名称,则会认为它们相等。