2009-07-30 7 views
5

PHP a une fonction in_array pour vérifier si une valeur particulière existe dans un tableau/collection natif. Je recherche une fonction/méthode équivalente pour ArrayObject, mais aucune des methods ne semble dupliquer cette fonctionnalité.Est-ce que ArrayObject de PHP a un équivalent in_array?

Je sais que je pourrais lancer l'ArrayObject en tant que (tableau) et l'utiliser dans in_array. Je sais aussi que je pourrais itérer manuellement sur ArrayObject et chercher la valeur. Ni l'un ni l'autre ne semble être la «bonne» façon de le faire.

"Non" est une réponse parfaitement appropriée si vous pouvez le sauvegarder avec des preuves.

+0

Le document que vous avez fourni semble indiquer clairement qu'il n'existe pas de telle méthode. Pedantically parlant, il n'est pas vraiment possible pour nous de prouver strictement qu'aucune telle fonction n'existe. Le document lié est la preuve que vous allez obtenir. –

+1

Les personnes qui travaillent sur le noyau PHP peuvent avoir plus d'informations. Les personnes ayant rencontré le problème et soumis un rapport de bogue pourraient avoir plus d'informations. La documentation OPS des PHPs ne couvre pas tout ce qu'elle pourrait. J'ai peut-être manqué quelque chose d'évident. Juste parce que ** vous ** ne peut pas répondre à la question ne signifie pas qu'il n'y a pas de réponse. –

Répondre

7

Non ignorant Même la documentation, vous pouvez voir par vous-même

echo '<pre>'; 
print_r(get_class_methods(new ArrayObject())); 
echo '</pre>'; 

Alors il vous reste peu de choix. Une option, comme vous le dites, est de le lancer

$a = new ArrayObject(array(1, 2, 3)); 
if (in_array(1, (array)$a)) 
{ 
    // stuff 
} 

Qui est, IMO, la meilleure option. Vous pouvez utiliser la méthode getArrayCopy() mais c'est probablement plus cher que l'opération de fusion, sans compter que ce choix aurait une sémantique discutable.

Si l'encapsulation est votre objectif, vous pouvez faire votre propre sous-classe de ArrayObject

class Whatever extends ArrayObject 
{ 
    public function has($value) 
    { 
    return in_array($value, (array)$this); 
    } 
} 

$a = new Whatever(array(1, 2, 3)); 
if ($a->has(1)) 
{ 
    // stuff 
} 

Je ne recommande pas itération du tout, c'est O (n) et tout simplement pas la peine compte tenu des solutions de rechange.

+1

"Je ne recommande pas l'itération du tout, c'est O (n)" 'in_array' est lui-même O (n), non? –

Questions connexes