Cómo comprobar en PHP si existe un índice en un array recuperando su valor al mismo tiempo

Por: Sergi Rodríguez
15-02-2018 12:14

[Cuidado, ¡¡¡editado!!] Gracias a los atinados comentarios de un compañero (gracias David Valdez) me he dado el tiempo de realizar un script tipo test para comparar empíricamente ambos métodos expuestos en esta publicación. La noticia es que el resultado sorprendentemente demuestra que !el método que yo pensaba inicialmente que iba a ser más rápido, es en cambio un 200% más lento!  Así, pues tienes que saber que no deberías aplicar el método del @$big_array[$unknown_index] para recuperar el valor de un array para un índice dado, sino simplemente usar la verificación previa con isset($big_array[$unknown_index]).

Parece ser que el problema es que el uso de @ aumenta los tiempos de procesamiento porqué obliga al PHP a invertir un tiempo extra (y costoso) en eliminar el error generado. Así que está desaconsejado si lo que pretendías era reducir tiempos ;)

Gracias a los comentarios que recibí en Facebook después de compartir esta publicación, realicé más métodos alternativos y los comparé, de los cuales el más rápido sigue siendo el convencional.

Moraleja: haz pruebas de tus "posibles mejoras" antes de creer que van a funcionar mejor.

Después de casi dos décadas programando con PHP ahora he dado con un método -POR FIN- para recuperar el valor de un índice concreto en un array sin tener que usar isset() para evitar la notificación de error de PHP, pudiendo saber, sin embargo, si existe o no existe ese índice.

En realidad he buscado este método porqué estoy desarrollando un script de PHP que va a trabajar con cientos de arrays de miles de índices en una sola llamada, y me iría muy bien para el rendimiento del algoritmo que pudiera hacer en un solo paso la verificación de que existe el índice en cuestión y la recuperación de su valor en caso afirmativo.

Es decir, el comando isset() no me sirve, pues hace un recorrido de TODOS LOS ELEMENTOS del array para ver si existe el índice, y en caso afirmativo (usando una cláusula IF) debo mandar al PHP recorrer de nuevo el array para recuperar ese valor. Si me preguntas, diría que es un poco estúpido. Así que me he dado a la tarea de buscar en ese mar infinito de sabiduría compartida que es internet y le he sumado unas cuantas pruebas para depurar el método hasta hallar una solución, que orgullosamente comparto:

PHP alternative to isset to get array index without errors

Muy, muy, pero que muy sencillo:

  1. Usamos el símbolo @ antepuesto a la consulta del array del índice que nos interesa y de este modo PHP no lanzará un mensaje de error si el índice en cuestión no existe.
  2. Esta asignación con la @ nos devuelve el valor del array para ese índice en el caso de que exista, por supuesto, pero en caso de que no exista nos devuelve NULL.
  3. De este modo, con una condicional del tipo $valor === NULL podremos saber si el índice existe o no y actuar en consecuencia :-)

Para poner a prueba este método he fabricado el ejemplo de arriba para comprobar que solamente devuelva NULL en el caso del índice 'a' (que no ha sido definido) y el caso del índice 'e' (que fue definido pero después "eliminado" usando unset() ) Y efectivamente, ésta es la salida de esas líneas:

He incluído la línea 3 del ejemplo para forzar los errores por pantalla en PHP en tiempo de ejecución. Y así estar seguros de que este método no genera ningún problema a nivel de errores. Teniendo en cuenta que uso la versión 7.0 de PHP.

ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1);

También quiero comentar que la comprobación del valor nulo puede hacerse de varias formas. Y he escogido ésta porqué he leído por ahí que alguien hizo pruebas con diferentes métodos y éste es el que reduce A LA MITAD el tiempo de ejecución. Lo cuál se nota si has de hacer varios millares de comprobaciones en una sola llamada.

Etiquetas : php

Comentarios 0 Visitas 634

Comentarios


Añada su comentario:

(pregunta anti-robots)

Enviar

DÍGANOS QUÉ NECESITA

¡¡ Le respondemos antes de 24h !!
Puede dejarnos su teléfono.

Puede rellenar el formulario (pulsar botón derecha) o bien aquí tiene nuestros datos de contacto.

(pregunta anti-robots)
Aceptamos pagos en Bitcoins, Ethereum, y otras criptomonedas.
Leer más