Hi internals
There's an open bug report that array_unique doesn't work for enums:
https://github.com/php/php-src/issues/9775
This comes down to the fact that array_unique internally sorts the
array before iterating over it to remove duplicates, and that enums
are intentionally incomparable.
Foo::Bar < Foo::Baz // false
Foo::Baz < Foo::Bar // false
Unfortunately, this means that array_unique might coincidentally work
fine if the array is already sorted, or gets correctly sorted by
chance while breaking otherwise.
To solve this, I propose adding an ARRAY_UNIQUE_IDENTICAL option that
can be passed to array_uniques $flags which uses identical operator
(===) semantics. Internally it uses a new hashmap that allows using
arbitrary PHP values as keys to efficiently remove duplicates. This is
slightly over-engineered for this use case. However, this data
structure will be required for implementing ADTs to deduplicate
instances with the same values. This hashmap is a heavily minimized
version of the teds extensions StrictHashMap [1].
Time complexity of this function is O(n). With the exception of
SORT_STRING (which uses PHPs existing hashmap in a very similar
fashion and also has O(n)) it should scale better than the other sort
options which are O(n log n).
Here's a link to the implementation:
https://github.com/php/php-src/pull/9882/files
If there are no concerns or complaints I'd like to merge this into PHP
8.3. Otherwise I will create an RFC. Looking forward to your feedback.
Ilija
[1| https://github.com/TysonAndre/pecl-teds/blob/main/teds_stricthashmap.c
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php