Why array_unique does not detect duplicate objects?
For your issue at hand, I am really suspecting this is coming from the way
array_unique
is removing elements out of the array, when using the SORT_REGULAR
flag, by:
- sorting it
- removing adjacent items if they are equal
And because you do have a Proxy
object in the middle of your User
collection, this might cause you the issue you are currently facing.
This seems to be backed up by the warning of the sort
page of PHP documentation, as pointed out be Marvin's comment.
Warning Be careful when sorting arrays with mixed types values because
sort()
can produce unexpected results, ifsort_flags
isSORT_REGULAR
.
Source: https://www.php.net/manual/en/function.sort.php#refsect1-function.sort-notes
Now for a possible solution, this might get you something more Symfony flavoured.
It uses the ArrayCollection
filter
and contains
methods in order to filter the second collection and only add the elements not present already in the first collection.
And to be fully complete, this solution is also making use of the use
language construct in order to pass the second ArrayCollection
to the closure function needed by filter
.
This will result in a new ArrayCollection
containing no duplicated user.
public static function merge(Collection $a, Collection $b, bool $unique = false): Collection {
if($unique){
return new ArrayCollection(
array_merge(
$a->toArray(),
$b->filter(function($item) use ($a){
return !$a->contains($item);
})->toArray()
)
);
}
return new ArrayCollection(array_merge($a->toArray(), $b->toArray()));
}