Php 数组_的结果是唯一的
在项目中使用DateTime时,如果使用具有object元素的数组所特有的array_(但仅在DateTime中存在问题),则再次出现复制问题,请参见代码: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
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
。