2012-07-31 5 views
12

Führt in_array() einen Objektvergleich durch, bei dem überprüft wird, ob alle Attribute identisch sind? Was, wenn $obj1 === $obj2, wird es nur Zeiger Vergleich stattdessen tun?Wie prüft in_array, ob sich ein Objekt in einem Array von Objekten befindet?

Ich verwende ein ORM, also würde ich lieber über die Objekte testen, wenn $obj1->getId() bereits im Array ist, wenn es Objektvergleich durchführt. Wenn nicht, ist in_array viel prägnanter.

Antwort

28

in_array() tut lose Vergleiche ($a == $b), es sei denn Sie TRUE auf das dritte Argument übergeben, in welchem ​​Fall es tut strenge Vergleiche ($a === $b).

Semantisch ist in_array($obj, $arr) identisch dies:

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

... und in_array($obj, $arr, TRUE) ist identisch mit dieser:

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

... und die manual auf zitieren, was das eigentlich überprüft:

Bei Verwendung des Vergleichsoperators (==) werden Objektvariablen compa rot auf einfache Weise, nämlich: Zwei Objektinstanzen sind gleich, wenn sie dieselben Attribute und Werte haben und Instanzen derselben Klasse sind.

Bei Verwendung des Identity-Operators (===) hingegen sind Objektvariablen genau dann identisch, wenn sie sich auf dieselbe Instanz derselben Klasse beziehen.

+1

Ehrfürchtig, danke. Es gibt einen blöden Timer, also kann ich nicht für weitere 5 Minuten akzeptieren. – yellottyellott

0

Objekte sind immer Referenzen in PHP 5+ und können nur mit clone kopiert werden (wodurch ein neues Objekt erstellt wird).

Das bedeutet, Sie sollten in_array() verwenden können.

Verwandte Themen