2012-07-31 17 views
12

Fa il confronto degli oggetti in_array() dove verifica che tutti gli attributi siano gli stessi? E se invece fosse $obj1 === $obj2, farebbe solo il confronto tra puntatori?In che modo in_array controlla se un oggetto si trova in una matrice di oggetti?

Sto usando un ORM, quindi preferirei eseguire il loop degli oggetti testando se $obj1->getId() è già presente nell'array se esegue il confronto degli oggetti. In caso contrario, in_array è molto più conciso.

risposta

28

in_array() fa sciolti confronti ($a == $b) a meno che non si passa TRUE al terzo argomento, nel qual caso lo fa severe confronti ($a === $b).

vista semantico, in_array($obj, $arr) è identica a questa:

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

... e in_array($obj, $arr, TRUE) è identica a questa:

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

... e per citare il manual su ciò che questo verifichi effettivamente:

Quando si utilizza l'operatore di confronto (==), le variabili oggetto sono composte rosso in una maniera semplice, vale a dire: due istanze di oggetto sono uguali se hanno gli stessi attributi e valori e sono istanze della stessa classe.

D'altra parte, quando si utilizza l'operatore di identità (===), le variabili di oggetto sono identiche se e solo se si riferiscono alla stessa istanza della stessa classe.

+1

Impressionante, grazie. C'è uno stupido timer, quindi non posso accettare altri 5 minuti. – yellottyellott

0

Gli oggetti sono sempre riferimenti in PHP 5+ e possono essere copiati (creando così un nuovo oggetto) utilizzando clone.

Ciò significa che dovresti essere in grado di utilizzare in_array().

Problemi correlati