Как 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()
,