|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2021-12-03 11:30 UTC] stanislav dot eismont at gmail dot com
Description:
------------
array_unique returns incorrect result with SORT_REGULAR flag.
Test script:
---------------
<?php
$array = ["red", "color" => "red", 78, 78, 12, "12", false, null, false, 0, true, 1, 0, null, 2.12, "2.12", 8, "-s"];
var_dump(array_unique($array, SORT_REGULAR));
Expected result:
----------------
Expected one "red" value printed:
array(11) {
[0]=>
string(3) "red"
// ...
}
Actual result:
--------------
Actually "red" printed twice:
array(11) {
[0]=>
string(3) "red"
["color"]=>
string(3) "red"
// ...
}
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Nov 07 19:00:02 2025 UTC |
> Isn't this just a result of inconsistent comparisons during > sorting? Right, although PHP 5 produced the required results[1]. Anyhow, SORT_REGULAR has a fundamental flaw when working on arbitrarly mixed scalar types, namely that the result is not necessarily in monotonic order, i.e. the sort has arbitrary results (depending on the sorting algorithm). E.g. consider ['2', 'a', 1]; the following holds prior to PHP 8.0.0: '2' < 'a' 'a' < 1 '2' > 1 As of PHP 8.0.0, this is no longer the case for the given example (thanks to the saner string to number comparisons), but consider another example: ['!', '0', true]; the following holds: '!' < '0' '0' < true '!' == true That still doesn't work. So the current O(log n) algorithm of array_unique(), would need to be changed to an O(n²) algorithm, or the sorting algorithm would need to be changed back to what we had in PHP 5. Neither option is desireable, and I think we should just document this limitation. (And we also should fix the note in the description section, which only applies for SORT_STRING.) [1] <https://3v4l.org/RfFJr>