No desea la manera más rápida pero más legible. Y eso es in_array()
(JavaScript: array.indexOf(value) >= 0
) para más de 2 o 3 valores. La diferencia de rendimiento es insignificante: mientras que una llamada a función y creación de matriz ciertamente tiene cierta sobrecarga, no importa si se compara con costosas operaciones como acceso a archivos, acceso a bases de datos, acceso a la red, etc. Por lo tanto, al final, nadie notará la diferencia.
He aquí una breve benchmark, cada uno con 1 millón de iteraciones:
5.4829950332642 - in_array, the array is recreated everytime
2.9785749912262 - in_array, the array is created only once
0.64996600151062 - isset(), the array way created only once and then the values were turned to keys using array_flip()
2.0508298873901 - ||
Por lo tanto, el más rápido, pero aún así es muy fácil de leer esto. A menos que cree $arr
solo una vez y úselo muchas veces, no es necesario y simplemente puede quedarse con in_array()
.
$arr = array_flip(array('your', 'list', 'of', 'values'));
if(isset($arr[$value])) ...
En caso de que qué pide JavaScript (! En este caso deshacerse de esas $
prefijos), la mejor solución es utilizar Array.indexOf()
:
['a', 'b', 'c'].indexOf(value) >= 0
Sin embargo, no todos los navegadores ya son compatibles con Array.indexOf()
, por lo que es posible que desee utilizar, por ejemplo la función de Underscore.js:
_.contains(['a', 'b', 'c'], value)
jQuery también tiene una función para esto:
$.inArray(value, ['a', 'b', 'c'])
La forma más rápida sería con un objeto y el operador in
, pero la definición del objeto es menos legible que la matriz definición:
value in {'a':0, 'b':0, 'c':0}
Aquí hay un punto de referencia JSPerf para las diversas soluciones: http://jsperf.com/inarray-vs-or - pero de nuevo, en lugar de la b La diferencia de rendimiento ig es insignificante en la mayoría de los casos, ya que no va a ejecutar el código millones de veces en un bucle.
tienen la complejidad O (n) del peor caso, donde n es la cantidad de cosas que está probando, la única ganancia de rendimiento sería una no es una llamada a función, mientras que la otra sí lo es. –
¿Es esto realmente JavaScript de lo que estás hablando? – Niko
En un nivel práctico, sin embargo, me inclinaría hacia algo como 'inArray()' más solo por el hecho de que tiene un mayor potencial para ser dinámico para grandes conjuntos de datos de contracheck. Además de ser más fácil de leer. ¡Imagínense si tuviéramos 10 o más valores para contraatacar! : D –