2012-07-31 12 views
12

in_array()は、すべての属性が同じであることを確認するオブジェクト比較を行いますか? $obj1 === $obj2の場合は、代わりにポインタの比較を行うだけですか?in_arrayはオブジェクトがオブジェクトの配列内にあるかどうかをどのようにチェックしますか?

私はORMを使用していますので、オブジェクト比較の場合には$obj1->getId()が既に配列にある場合はオブジェクトテストをループしたいと思います。そうでない場合は、in_arrayがはるかに簡潔です。

答えて

28

in_array()ルーズ比較($a == $b)を行います。

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

...とin_array($obj, $arr, TRUE)はこれに同じです::

は意味的に、in_array($obj, $arr)はこれと同じです

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

...と、これは実際にチェックするものにmanualを引用します:

比較演算子(==)を使用する場合、オブジェクト変数はcompaつまり、2つのオブジェクトインスタンスが同じ属性と値を持ち、同じクラスのインスタンスである場合、2つのオブジェクトインスタンスは等しいとみなされます。

一方、アイデンティティ演算子(===)を使用する場合、オブジェクト変数は、同じクラスの同じインスタンスを参照する場合に限り、同じです。

+1

大変感謝しています。愚かなタイマーがあるので、私は別の5ミントを受け入れることはできません。 – yellottyellott

0

オブジェクトはPHP 5以降で常に参照され、cloneを使用してのみコピーできます(したがって、新しいオブジェクトを作成できます)。

つまり、in_array()を使用できるはずです。それは厳密比較を行い、その場合、第三の引き数、($a === $b)にTRUEを通過しない限り

関連する問題