array_unique for objects? array_unique for objects? php php

array_unique for objects?


array_unique works with an array of objects using 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));

Will print:

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

See it in action here: http://3v4l.org/VvonH#v529

Warning: it will use the "==" comparison, not the strict comparison ("===").

So if you want to remove duplicates inside an array of objects, beware that it will compare each object properties, not compare object identity (instance).


Well, array_unique() compares the string value of the elements:

Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2 i.e. when the string representation is the same, the first element will be used.

So make sure to implement the __toString() method in your class and that it outputs the same value for equal roles, e.g.

class Role {    private $name;    //.....    public function __toString() {        return $this->name;    }}

This would consider two roles as equal if they have the same name.


This answer uses in_array() since the nature of comparing objects in PHP 5 allows us to do so. Making use of this object comparison behaviour requires that the array only contain objects, but that appears to be the case here.

$merged = array_merge($arr, $arr2);$final  = array();foreach ($merged as $current) {    if ( ! in_array($current, $final)) {        $final[] = $current;    }}var_dump($final);