Búsqueda secuencial en arreglo de PHP

Introducción

A los arreglos podemos aplicarles búsquedas. No importa si es un arreglo de objetos, de números, de cadenas o de lo que sea, siempre se les podrá aplicar una búsqueda secuencial usando PHP.

Una búsqueda bastante popular (aunque no es la más óptima) es la búsqueda secuencial, en donde iteramos todo el arreglo comparando cada elemento con la búsqueda.

La velocidad de este algoritmo radica en la “suerte” que tengamos. Por ejemplo, si el elemento que buscamos está en la posición 2, sólo se habrán hecho 3 iteraciones (porque comienzan en 0); en cambio, si está en la posición 100000 se habrán hecho 100001.

Hay otros algoritmos, pero hoy veremos el de la búsqueda secuencial que es muy simple.

Búsqueda secuencial en arreglo de PHP

Métodos nativos

PHP proporciona métodos nativos. Tranquilo, si vienes por el algoritmo está más abajo, pero puede que hayas venido para ver la forma más óptima de buscar el índice del elemento en un arreglo.

Este lenguaje proporciona el método array_search que busca un valor en un arreglo. Esto es útil cuando tenemos datos simples como enteros o cadenas, no funcionará con objetos que tengan propiedades.

Veamos este ejemplo en donde definimos un simple arreglo:

Ahí dirá que está en el índice 0. Si buscamos algo que no existe, devolverá false. Es importante comparar con el operador de identidad ===.

Por ejemplo, en este caso $indice será false:

Entonces para comparar si existe o no, primero comprobamos si el valor es false. En caso de que sea false, significa que el elemento no está presente en el arreglo. Si es un número, entonces es el índice.

Búsqueda estricta con array_search

Sabemos que PHP es un lenguaje de tipado débil, por eso el tercer parámetro de esta función es un booleano indicando si queremos que la comparación se haga con === o con ==. Recomiendo ponerlo como true para que se haga con el operador de identidad ===.

Por dar un ejemplo, se haría así:

Si lo ponemos como false o no lo ponemos, y hay un arreglo de números mezclados con cadena puede que busquemos la cadena 0″ pero si lo comparamos con el entero 0 usando == devolverá true, dándonos resultados equivocados.

Métodos hechos por nosotros

Si queremos hacerlo manualmente, ya sea porque queremos implementar el algoritmo o porque queremos una búsqueda personalizada, aquí está el código necesario. Este método nos da más control sobre lo que hacemos.

Recomiendo encerrar todo esto dentro de una función que se parezca a array_search; es decir, que reciba un arreglo por referencia, así como una búsqueda y devuelva el índice o -1 (no false) en caso de no encontrar nada.

Para un arreglo de enteros (el más básico) sería así:

Aquí un ejemplo de su llamada:

La salida es: El número 441 está en la posición 7

Lo mismo podríamos hacer con cadenas, y al hacerlo de esta manera podemos ignorar mayúsculas o hacer cosas más interesantes.

Búsqueda secuencial con objetos

Como lo dije, array_search no provee un método para comparar objetos. Por ejemplo, supongamos que tenemos un carrito de compras que tiene objetos de la clase Producto.

Para simplificar, un producto únicamente tiene código de barras, precio y descripción. La clase queda así:

Es para ejemplificar, no lo olvides. Luego podemos tener un arreglo como este:

La función para hacer una búsqueda secuencial en un arreglo de objetos (en este caso de productos) es esta:

Es exactamente lo mismo que el ejemplo de arriba, sólo que como ahora trabajamos con objetos tenemos que acceder a sus propiedades y compararlas.

Si necesitas comparar otra propiedad, la comparas y ya. O puedes comparar dos al mismo tiempo; incluso puedes compararlas a todas.

 

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario