php

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:

See the gist on github.

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:

See the gist on github.

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í:

See the gist on github.

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í:

See the gist on github.

Aquí un ejemplo de su llamada:

See the gist on github.

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í:

See the gist on github.

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

See the gist on github.

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

See the gist on github.

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

5 horas hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

21 horas hace

PHP: incrustar imagen en base64

El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…

22 horas hace

Plugin ESC POS – Actualización 3.4.0: imprimir HTML

El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…

2 días hace

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

1 semana hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

1 semana hace

Esta web usa cookies.