in_array如何检查对象是否在对象数组中?

时间:2012-07-31 15:23:48

标签: php object-comparison

in_array()在检查所有属性是否相同的情况下进行对象比较吗? 如果$obj1 === $obj2,它只是做指针比较会怎么样?

我正在使用ORM,所以如果对象比较,如果$obj1->getId()已经在数组中,我宁愿循环测试对象。如果没有,in_array更加简洁。

2 个答案:

答案 0 :(得分:29)

in_array()执行松散比较($a == $b)除非您将TRUE传递给第三个参数,在这种情况下它会 strict 比较($a === $b)。

从语义上讲,in_array($obj, $arr)与此相同:

foreach ($arr as &$member) {
  if ($member == $obj) {
    return TRUE;
  }
}
return FALSE;

...和in_array($obj, $arr, TRUE)与此相同:

foreach ($arr as &$member) {
  if ($member === $obj) {
    return TRUE;
  }
}
return FALSE;

...并引用manual关于实际检查的内容:

  

使用比较运算符(==)时,会以简单的方式比较对象变量,即:如果两个对象实例具有相同的属性和值,则它们是相同的,并且是同一类的实例。

     

另一方面,当使用身份运算符(===)时,对象变量是相同的,当且仅当它们引用同一个类的相同实例时。

答案 1 :(得分:0)

对象始终是PHP 5+中的引用,只能使用clone复制(从而创建新对象)。

这意味着您应该可以使用in_array()