php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #62977 array_unique() misbehaves with array of DateTimes
Submitted: 2012-08-30 13:24 UTC Modified: 2017-05-04 17:26 UTC
Votes:4
Avg. Score:4.0 ± 1.0
Reproduced:0 of 0 (0.0%)
From: ladislav at marek dot su Assigned: laruence (profile)
Status: Assigned Package: Date/time related
PHP Version: 5.4Git-2012-08-30 (Git) OS: Linux
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: ladislav at marek dot su
New email:
PHP Version: OS:

 

 [2012-08-30 13:24 UTC] ladislav at marek dot su
Description:
------------
array_unique() returns duplicates for array which contains objects with DateTime 
instances.

Test script:
---------------
<?php

class Foo
{
	public $dt;

	function __construct($dt)
	{
		$this->dt = $dt;
	}
}

$foo = new Foo(new DateTime);
$std = new stdClass;
$arr = [$foo, $foo, $std, $std, $std];

var_dump(array_unique($arr, SORT_REGULAR));

Expected result:
----------------
array(4) {
  [0]=>
  object(Foo)#1 (1) {
    ["dt"]=>
    object(DateTime)#2 (3) {
      ["date"]=>
      string(19) "2012-08-30 15:18:01"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/Prague"
    }
  }
  [2]=>
  object(stdClass)#3 (0) {
  }
}

Actual result:
--------------
array(4) {
  [0]=>
  object(Foo)#1 (1) {
    ["dt"]=>
    object(DateTime)#2 (3) {
      ["date"]=>
      string(19) "2012-08-30 15:18:01"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/Prague"
    }
  }
  [1]=>
  object(Foo)#1 (1) {
    ["dt"]=>
    object(DateTime)#2 (3) {
      ["date"]=>
      string(19) "2012-08-30 15:18:01"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/Prague"
    }
  }
  [2]=>
  object(stdClass)#3 (0) {
  }
  [4]=>
  object(stdClass)#3 (0) {
  }
}

Patches

bug62977.patch (last revision 2012-08-30 15:52 UTC) by laruence@php.net)

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-08-30 14:34 UTC] laruence@php.net
-Assigned To: +Assigned To: laruence
 [2012-08-30 15:52 UTC] laruence@php.net
The following patch has been added/updated:

Patch Name: bug62977.patch
Revision:   1346341925
URL:        https://bugs.php.net/patch-display.php?bug=62977&patch=bug62977.patch&revision=1346341925
 [2012-08-30 17:27 UTC] cataphract@php.net
laruuence: The patch is very strange. Why are making all the elements of the same class being compared equal? Objects can be compared. Perhaps you should fix the DateTime's compare_objects() object handler.
 [2012-08-31 03:41 UTC] laruence@php.net
Cataphrac, that's why I didn't commit it, and the reason is because the comparable 
calss are not neighbouring after sorting.

that's not much thing to do with the compare handler of specific handler.

thanks
 [2012-08-31 04:08 UTC] laruence@php.net
fixing this we should introduce a new sorting function for objects

which will make the nearest objects be neighbourings after sorting,  leaving the 
comparing to the unique phase.

but the problem is how to implement "the nearest" (equal > same ce > not equal)
 [2017-05-04 17:26 UTC] peehaa@php.net
-Package: Class/Object related +Package: Date/time related
 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC