2010-12-23 34 views
23

Tengo una función de bucle while larga, cada vez que se carga para verificar con el nombre de URL. Así que necesito saber cuál es mejor para comprobar URL nombre en una gran matriz dentro del ciclo while, in_array() o array_search() función.que es mejor array_search o in_array?

Respuesta

28

Sobre la base de la documentación de in_array y array_search, yo creo que depende principalmente de lo que quiere hacer con la información: si usted necesita la entrada, utilice array_search, si lo que desea es comprobar si existe la url en la matriz, in_array debería ser suficiente.

+0

Depende de la hora, ¿cuál es la mejor? – Thilak

+0

Después de referencia de larga duración, y depende de mis requisitos, he elegido la función in_array. – Thilak

47

Si se trata de una matriz grande y en un bucle, ninguno es "mejor". En su lugar, use array_flip() en su matriz, para que las URL se conviertan en claves. Y use isset() para verificar la presencia.

+0

Gracias Mario, este es un método alternativo. Pero compare esta función con la función in_array y array_search, ¿esta función dará resultado de velocidad? – Thilak

+1

PHP es MUCHO más rápido al verificar la existencia de claves que valores. Si tiene un conjunto grande de valores únicos a los que debe referirse con frecuencia, siempre configúrelos como claves. –

+5

Para que esto funcione, los valores originales deben ser enteros o cadenas. Si bien se aplica a la pregunta de OP, no puede usarse como una solución general. –

0

Si su único objetivo es comprobar si existe una URL en la matriz, iría a in_array. A pesar de que la mejor manera es tener las teclas establecidas para que pueda buscar por la tecla de matriz. De esa manera ahorras mucho bucle.

$searchword = "test"; 
echo $array[$searchword]; 
+0

Creo que admite la función array_key_exists(). Exactamente necesito la función para reducir nuestro tiempo de búsqueda. – Thilak

4

es función diferente in_array - devolver verdadero si encuentra valor array_search - posición de retorno si el valor hallazgo

$a = array('a', 'b'); 
var_dump(in_array('a', $a)); // return true 
var_dump(array_search('a', $a)); // return 0 
if (array_search('a', $a)) - false 
+1

Gracias AmdY, sí, estás en lo cierto. Pero necesito qué función para obtener el resultado de la velocidad. – Thilak

48

No hay una respuesta real aquí. Así que lo intenté yo mismo.

$haystack = array 
(
    'apple', 
    'banana', 
    'cherry', 
    'lemon', 
    'lime', 
    'orange', 
    'potato', 
    'rutabaga' 
); 
$haySize = count($haystack); 

$loops = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : 10000; 
// echo 'Loops: ' . $loops . "\n"; 

$start = microtime(true); 
for ($i = 0; $i < $loops; $i++) 
{ 
    $needle = $haystack[ $i % $haySize ]; 
} 
$zeroTime = microtime(true) - $start; 
// echo sprintf('%0.3f', $zeroTime * 1000) . ' ms : zero time' . "\n"; 

$start = microtime(true); 
for ($i = 0; $i < $loops; $i++) 
{ 
    $needle = $haystack[ $i % $haySize ]; 
    $dummy = array_search($needle, $haystack); 
} 
echo sprintf('%0.3f', (microtime(true) - $start - $zeroTime) * 1000) . ' ms : array_search' . "\n"; 

$start = microtime(true); 
for ($i = 0; $i < $loops; $i++) 
{ 
    $needle = $haystack[ $i % $haySize ]; 
    $dummy = in_array($needle, $haystack); 
} 
echo sprintf('%0.3f', (microtime(true) - $start - $zeroTime) * 1000) . ' ms : in_array' . "\n"; 
    echo sprintf('%0.3f', (microtime(true) - $start) * 1000).' ms : in_array'."\n"; 

Para un caso de uso típico, in_array victorias, pero la diferencia es insignificante:

22.662 ms : array_search 
22.104 ms : in_array 

Actualizado 02/01/2014: bucle noop añadido a "cero de la escala". Ejecutando PHP 5.4.17 en una nueva MacBook pro, este es un resultado típico:

24.462 ms : array_search 
24.984 ms : in_array 
+14

+1 por dar algunos puntos de referencia.Me gustaría añadir a esto señalando que el método array_flip/isset provisto por @mario es mucho más rápido que array_search y in_array, siempre que la matriz se invierta fuera del ciclo. Agregado en la parte inferior de su código de prueba: '$ flipped = array_flip ($ haystack); $ start = microtime (verdadero); for ($ i = 0; $ i <$ loops; $ i ++) { $ needle = $ haystack [$ i% $ haySize]; $ dummy = isset ($ flipped [$ needle]); } echo sprintf ('% 0.3f', (microtime (verdadero) - $ inicio) * 1000). ' ms: isset '. "\ n"; ' 25.281 ms: array_search 22.345 ms: in_array 4.895 ms: isset – WildlyInaccurate

+0

Un buen punto. Esto sería útil si necesita buscar valores múltiples. Sin embargo, si solo está buscando una vez, sería peor incurrir en el costo de construir el hash. Consideré que el "caso típico" es buscar en la matriz por un único valor. –

+0

La pregunta original es difícil de entender, pero puede estar hablando de un caso en el que array_flip es la mejor solución. –

0

Depende de su tamaño de matriz. -Si tiene una pequeña gama (como < 500k de 32 bits de clave), in_array y darle array_search mismo rendimiento isset (array [aguja]) no tienen sentido, porque de flip()

-por grandes matrices (como> 1m 32bit key) Hay una gran diferencia entre in_array y isset (array [needle])