php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #65208 array_unique SORT_STRICT flag for predictable results with type-mixed values
Submitted: 2013-07-05 10:02 UTC Modified: 2020-11-11 11:20 UTC
Votes:4
Avg. Score:4.5 ± 0.5
Reproduced:4 of 4 (100.0%)
Same Version:2 (50.0%)
Same OS:2 (50.0%)
From: of dot olivier dot favre at gmail dot com Assigned:
Status: Open Package: Arrays related
PHP Version: 5.4.4 OS: Debian wheezy
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2013-07-05 10:02 UTC] of dot olivier dot favre at gmail dot com
Description:
------------
The doc claims “SORT_REGULAR - compare items normally (don't change types)”
Hence (int)1 and (string)"1" should both be considered non duplicates.

Current results with SORT_REGULAR are too unpredictable for this function/flag to 
be useful.

See #47370:
“I think it's better for SORT_REGULAR to compare elements by using === instead of 
==.”

Request:
Add a SORT_STRICT flag using strict === comparison between elements. (prevents 
from changing SORT_REGULAR behavior).


Tested on:
Debian GNU/Linux 7.1 (wheezy)
$ php --version
PHP 5.4.4-10 (cli) (built: Nov 24 2012 11:21:26) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans

Test script:
---------------
var_export(array_unique(array( 1, 2, 2, 3, "1"), SORT_REGULAR)); // "1" is suppressed!
echo "\n";
var_export(array_unique(array( 1, 2, 2, 3, "1", "c"), SORT_REGULAR)); // "1" and "c" are kept (as it should be)
echo "\n";

// Weirder, with the same values in an other order
var_export(array_unique(array( 1, 2, 2, 3, "1", "c"), SORT_REGULAR)); // "1" and "c" are kept (as it should be)
echo "\n";
var_export(array_unique(array( "c", 1, 2, 2, 3, "1"), SORT_REGULAR)); // "1" is suppressed!
echo "\n";

Expected result:
----------------
array (
  0 => 1,
  1 => 2,
  3 => 3,
  4 => '1',
)
array (
  0 => 1,
  1 => 2,
  3 => 3,
  4 => '1',
  5 => 'c',
)
array (
  0 => 1,
  1 => 2,
  3 => 3,
  4 => '1',
  5 => 'c',
)
array (
  0 => 'c',
  1 => 1,
  2 => 2,
  4 => 3,
  5 => '1',
)


Actual result:
--------------
array (
  0 => 1,
  1 => 2,
  3 => 3,
)
array (
  0 => 1,
  1 => 2,
  3 => 3,
  4 => '1',
  5 => 'c',
)
array (
  0 => 1,
  1 => 2,
  3 => 3,
  4 => '1',
  5 => 'c',
)
array (
  0 => 'c',
  1 => 1,
  2 => 2,
  4 => 3,
)


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2013-07-05 10:04 UTC] of dot olivier dot favre at gmail dot com
-Summary: array_unique with SORT_REGULAR inconsistently compare 1 and "1" +Summary: array_unique SORT_STRICT flag for predictable results with type-mixed values -Operating System: +Operating System: Debian wheezy -PHP Version: 5.4.17 +PHP Version: 5.4.4
 [2013-07-05 10:04 UTC] of dot olivier dot favre at gmail dot com
Better patch summary.
 [2020-11-11 11:08 UTC] enno dot woortmann at web dot de
Seems like the result of array_unique changed with the 8.0.0beta1 - rc3.

Test script
-----------
var_export(array_unique(['1', 'a', 1, 9, null], SORT_REGULAR));

Output with 8.0.0beta1 - rc3
array (
  0 => '1',
  1 => 'a',
  3 => 9,
  4 => NULL,
)

Output of all 7.x versions (and the alpha versions, except alpha2 which changed the order of the elements)
array (
  0 => '1',
  1 => 'a',
  2 => 1,
  3 => 9,
  4 => NULL,
)

compare: https://3v4l.org/WTZe6
 [2020-11-11 11:20 UTC] nikic@php.net
@enno dot woortmann at web dot de: This is due to https://wiki.php.net/rfc/string_to_number_comparison, which now sorts 1 and "1" next to each other, thus allowing it to correctly eliminate duplicates.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Mar 19 03:01:29 2024 UTC