Как in_array проверяет, находится ли объект в массиве объектов?

Есть ли in_array() сделать сравнение объектов, где он проверяет, что все атрибуты одинаковы? Что, если $obj1 === $obj2, он просто сделает сравнение указателей вместо этого?

Я использую ORM, поэтому я бы предпочел зацикливаться на тестировании объектов, если $obj1->getId() уже в массиве, если он выполняет сравнение объектов. Если не, in_array гораздо более кратким.

2 ответа

Решение

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;

... и процитировать руководство о том, что это на самом деле проверяет:

При использовании оператора сравнения (==) переменные объекта сравниваются простым способом, а именно: два экземпляра объекта равны, если они имеют одинаковые атрибуты и значения, и являются экземплярами одного и того же класса.

С другой стороны, при использовании оператора тождества (===) переменные объекта идентичны тогда и только тогда, когда они ссылаются на один и тот же экземпляр того же класса.

Объекты всегда являются ссылками в PHP 5+ и могут быть скопированы (таким образом, создав новый объект) с помощью clone,

Это означает, что вы должны быть в состоянии использовать in_array(),

Другие вопросы по тегам