Solución:
yo asumo eso in_array
es una búsqueda lineal de 0 a n-1.
La búsqueda más rápida será almacenar los valores como claves y usar array_key_exists
.
$a['foo'] = true;
$a['bar'] = true;
if (array_key_exists('foo', $a)) ...
Pero si esa no es una opción, puede crear la suya propia para matrices indexadas con bastante facilidad:
function in_array_i($needle, array $a, $i = 0);
{
$c = count($a);
for (;$i < $c; ++$i)
if ($a[$i] == $needle) return true;
return false;
}
Comenzará en $i
, que puede realizar un seguimiento de sí mismo para omitir los primeros elementos.
O alternativamente…
function in_array_i($needle, array $a, $i = 0);
{
return in_array($needle, $i ? array_slice($a, $i) : $a);
}
Puede comparar para ver cuál es más rápido.
¿Cómo funciona internamente la función in_array?
Internamente el in_array()
busca desde el principio hasta el final de la matriz. Entonces, en tu caso, esto es lento.
Dependiendo de la naturaleza de sus datos, puede cambiar la estrategia de búsqueda. Si solo tienes valores no duplicados y todo los valores son de cadena o enteros (no NULL
), un truco común es array_flip()
la matriz que funciona bastante rápido y luego verifique si hay una entrada para su valor como clave en el hash de la matriz a través de isset()
:
$array = array( ... non-duplicate string and integer values ... );
$needle="find me!";
$lookup = array_flip($array);
$found = isset($lookup[$needle]) ? $lookup[$needle] : false;
if (false === $found) {
echo "Not found!n";
} else {
echo "Found at {$found}!n";
}
Si no se cumplen estas condiciones previas, puede hacer lo que konforce sugirió.
Si tiene realmente muchos datos y no solo está mirando desde el principio o el final, es posible que desee implementar un algoritmo de búsqueda por su cuenta, como no comenzar desde el principio ni el final, sino encapsular y / o comenzar en una posición aleatoria para distribuir el tiempo de búsqueda.
Además, puede mantener los elementos ordenados mientras se agregan a la matriz, probablemente, lo que luego se puede buscar mucho más rápido con un algoritmo de ajuste.