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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: of dot olivier dot favre at gmail dot com
New email:
PHP Version: OS:

 

 [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

Pull Requests

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: Thu Dec 26 16:01:31 2024 UTC