2012-07-31 1 views
12

Est-ce que in_array() effectue une comparaison d'objets lorsqu'il vérifie que tous les attributs sont identiques? Que faire si $obj1 === $obj2, fera-t-il juste la comparaison de pointeur à la place? J'utilise un ORM, donc je préfère faire une boucle sur le test des objets si $obj1->getId() est déjà dans le tableau s'il fait la comparaison d'objet. Sinon, in_array est beaucoup plus concis.Comment in_array vérifie-t-il si un objet se trouve dans un tableau d'objets?

Répondre

28

in_array()-t lâches comparaisons ($a == $b) à moins que vous passez TRUE au troisième argument, auquel cas il ne strictes comparaisons ($a === $b).

sémantiquement, in_array($obj, $arr) est identique à ceci:

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

... et in_array($obj, $arr, TRUE) est identique à ceci:

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

... et de citer le manual sur ce que cela vérifie en fait:

Lorsque vous utilisez l'opérateur de comparaison (==), les variables d'objet sont compa rouge d'une manière simple, à savoir: Deux instances d'objet sont égales si elles ont les mêmes attributs et valeurs, et sont des instances de la même classe. En revanche, lors de l'utilisation de l'opérateur d'identité (===), les variables d'objet sont identiques si et seulement si elles se réfèrent à la même instance de la même classe.

+1

Génial, merci. Il y a une minuterie stupide, donc je ne peux pas accepter pour 5 autres minutes. – yellottyellott

0

Les objets sont toujours des références en PHP 5+ et ne peuvent être copiés (créant ainsi un nouvel objet) qu'en utilisant clone. Cela signifie que vous devriez pouvoir utiliser in_array().

Questions connexes