Php 数组_的结果是唯一的

Php 数组_的结果是唯一的,php,arrays,date,datetime,Php,Arrays,Date,Datetime,在项目中使用DateTime时,如果使用具有object元素的数组所特有的array_(但仅在DateTime中存在问题),则再次出现复制问题,请参见代码: class simpleClass { public $dt; function __construct($dt) { $this->dt = $dt; } } $dateObj = new simpleClass(new DateTime); $std = new stdClass

在项目中使用DateTime时,如果使用具有object元素的数组所特有的array_(但仅在DateTime中存在问题),则再次出现复制问题,请参见代码:

class simpleClass
{
    public $dt;

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

$dateObj = new simpleClass(new DateTime);
$std = new stdClass;
$arr = [$dateObj, $dateObj, $std, $std, $std, $std];

var_dump(array_unique($arr, SORT_REGULAR));
应为1个带有dateObj的元素 但实际上有2个函数将比较字符串,所以对象将被强制转换为字符串。解决方法是使用magic方法返回完整的日期标识符:

class simpleClass
{
    public $dt;

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

    public function __toString() {
        return $this->dt->format('r');
    }

}

$dateObj1 = new simpleClass(new DateTime);
$dateObj2 = new simpleClass(new DateTime);
$dateObj3 = new simpleClass(new DateTime('today'));
$arr = [$dateObj1, $dateObj2, $dateObj3];

print_r(array_unique($arr));

我还是不明白。将阵列设置为:

$arr = [$dateObj, $dateObj, $std, $std];
返回:

array (size=2)
    0 => 
        object(simpleClass)[1]
            public 'dt' => 
              object(DateTime)[2]
                  public 'date' => string '2013-11-14 14:37:08' (length=19)
                  public 'timezone_type' => int 3
                  public 'timezone' => string 'Europe/Rome' (length=11)
    2 => 
       object(stdClass)[3]

这样,array_unique似乎可以工作…

有一些解决方法:你看,DateTimeEH的对象出现了一个问题,但不同的是你创建了3个对象,但我试图找到我问题的原因,我是我的项目,我不能只创建对象,比如你的示例我发现了某种错误,还有一个问题要解决reasons@sergio:是的,您的示例行为异常,它应该抛出某种错误或注意,因为如果您将
$dateObj
$std
转换为字符串,它将抛出
可捕获的致命错误:类CLASSNAME的对象无法转换为字符串
,但是,当您在函数array_unique()中使用它们时,其中执行了字符串的内部转换,没有出现错误,输出也很奇怪……嗯,这就是为什么我阅读了大量php文档,但没有找到答案的原因。@sergio:不过,
array_unique()
可以处理字符串<当且仅当(字符串)$elem1==(字符串)$elem2时,两个元素被视为相等。换句话说:当字符串表示形式相同时。将使用第一个元素。您正在将对象强制转换为字符串,而不必使用字符串魔术方法,因此这是一个很大的错误。Ehh,一些奇怪的行为,如我所说,如果对象不能转换为字符串,您将无法使用函数
array\u unique()
;结果将是不可预测的。好吧,我只是在调查。在我看来,同样有魔力的u-toString()也不起作用。@ilpaijin:你能举个例子说明u-toString()不起作用吗?似乎很难相信它不会起作用。@ilpaijin:从
array\u unique()
函数中删除第二个参数
SORT\u REGULAR