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

14

in_array()函数进行的是值比较,而非对象比较。如果您使用$obj1 === $obj2方式进行指针比较,则可以判断两个对象是否相同。

因为您正在使用ORM,所以最好使用循环来测试$obj1->getId()是否已经存在于数组中,这样可以进行对象比较。如果不是,那么使用in_array会更加简洁。

2个回答

30

in_array() 默认进行 宽松比较$a == $b),除非您将第三个参数设置为 TRUE,这样它就会进行 严格比较$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;

...并引用了手册上对于这个操作的说明:

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

而在使用恒等运算符(===)时,仅当对象变量引用同一个类的同一个实例时,它们才是相同的。


1
太棒了,谢谢。有一个愚蠢的计时器,所以我还需要等5分钟才能接受。 - yellottyellott

0

在 PHP 5+ 中,对象始终是引用类型,并且只能通过使用 clone 来复制(从而创建一个新对象)。

这意味着您应该能够使用 in_array()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接