Bucles en PHP. ¡Es hora de modernizarse!

Publicada en WordPress.

El otro día estaba repasando el código fuente de algunos de mis proyectos PHP antiguos y me di cuenta de que en prácticamente todos estoy usando las construcciones condicionales típicas para trabajar con bucles: los for, los while, y los do-while. Y de repente me dije: a ver, David, si hay formas más compactas y mejores de hacer esto, ¿por qué sigues anclado en el año 2010?

Como ahora en Nelio estamos modernizando nuestros conocimientos sobre el stack de desarrollo en JavaScript, y aprovechando que WordPress por fin sube la versión de PHP mínima que soporta, pensé que sería interesante hacer lo mismo en PHP. Por ello, hoy te traigo unos truquitos para escribir código en PHP de una forma más parecida a lo que vemos en JavaScript. No es nada nuevo, no es nada complicado… pero quizás es algo que no conocías.

Antes de empezar, permíteme que te recuerde un par de detalles que serán importantes para la entrada de hoy: los arrays en PHP y las funciones anónimas. Así que no perdamos ni un minuto más y pongámonos a escribir código más compacto e inteligible.

Los arrays en PHP

Como ya sabes, un array en PHP se puede definir usando la notación extendida con la palabra clave array:

o, desde la versión 5.4, con los paréntesis cuadrados []:

Además, es posible crear arrays asociativos (o diccionarios) si, además de especificar los valores que van dentro del array, especificamos la llave bajo la que está cada valor:

Las funciones anónimas en PHP

Otra «novedad» bastante chula de PHP son las funciones anónimas. Básicamente, se trata de funciones sin nombre y que suelen usarse como callbacks. Por ejemplo, el sistema de filtros y acciones de WordPress requiere especificar un callback para cada filtro o acción al que nos enganchamos:

En el ejemplo anterior, por ejemplo, hemos creado una función llamada multisite_body_classes y la usamos como callback del filtro body_class. Cada vez que WordPress necesite aplicar el filtro body_class, se llamará a la función multisite_body_classes. Pues bien, si hubiéramos querido, podríamos haber definido la función multisite_body_classes como una función anónima:

con lo que estaríamos pasándola directamente como parámetro al filtro. En este caso en concreto, lo recomendable es usar funciones con nombre, porque luego, si se quiere, se puede «eliminar» el vínculo entre el filtro o la acción y la función fácilmente:

mientras que con una función anónima es más complicado.

Operaciones más habituales con arrays y cómo escribirlas de forma «moderna»

Vale, ahora que ya tenemos las bases claras, vamos a ver algunos escenarios habituales con arrays y cómo hacerlo usando las funciones nativas de PHP.

Filtrar los elementos del array que cumplen una cierta condición

El primer ejemplo que se me ocurre es filtrar los elementos de un array que cumplen una cierta condición. Habitualmente, esto lo hacíamos creando una variable donde almacenar los resultados ($results) y luego recorriendo todos los elementos del array con un for, un foreach, un while, etc., comprobando cada elemento con en un if y añadiéndolo si cumplía la condición:

Pero esto, en realidad, es mucho más sencillo de realizar. PHP tiene una función que nos permite exactamente encontrar un valor dentro del array: array_filter. Veamos el ejemplo anterior usando esta función:

Esta función toma como segundo parámetro una función callback que se invoca para cada elemento del array original. Si la función devuelve cierto, el elemento se incluye en el resultado. Si no, no se incluye.

En este ejemplo hay un par de puntos que merece la pena comentar. Por un lado, el uso de la palabra clave use. Para poder usar una variable dentro de una función anónima debemos indicar de forma explícita que nuestra función tiene acceso a esa variable del ámbito superior, y esto lo hacemos usando la palabra clave use. En este caso para poder usar el parámetro $min_price dentro de la función anónima utilizamos use.

Por otro lado, debes tener en cuenta que la función array_filter mantiene las claves del array. Esto es especialmente útil para los arrays asociativos:

pero puede resultar extraño para los arrays no asociativos:

ya que el resultado tiene los índices movidos. Para garantizar que los índices del resultado empiezan en 0 y son correlativos, usamos array_values:

Buscar un valor concreto dentro del array

Otro ejemplo habitual es el de buscar el primer elemento que cumple una cierta condición dentro del array. Esto es muy parecido al caso anterior, pero en lugar de tener un array de resultados, tenemos un único $item:

En este caso, basta con repetir la solución anterior, pero indicando que queremos recuperar el elemento que tenemos en la posición 0:

Crear un array equivalente al original en el que hemos procesado todos los elementos de alguna forma

Otro ejemplo habitual es el de procesar todos los elementos del array para sacar un array nuevo. Por ejemplo, imagina que tenemos una lista de precios y queremos aplicar el 21% de IVA a todos ellos. ¿Cómo lo conseguimos?

Habitualmente, haríamos algo parecido a esto:

pero podemos usar la función array_map para conseguir el mismo efecto:

Procesar todos los elementos del array para extraer un único valor resumen

Supón que tienes una lista de productos de la compra y quieres sacar el precio total. Lo lógico sería guardar el precio en una variable $total_price e iterar sobre todos los productos sumando su precio al total acumulado que llevas:

Pues bien, disponemos de la función array_reduce para conseguir exactamente el mismo efecto:

con ella, básicamente especificamos el array sobre el que queremos trabajar, la función de acumulación (que tiene como parámetros el ítem actual y el valor que llevamos acumulado) y el valor inicial de dicho acumulador.

Algunos ejemplos más…

Si queremos quedarnos con los elementos que están en un array pero no en otro, podemos usar la función array_diff que calcula la «diferencia» entre ambos:

Para eliminar los valores duplicados de un array, tenemos array_unique:

Para saber si un valor está en el array o no, tenemos in_array:

Y un largo etcétera que te recomiendo que mires.

En definitiva

Ahora que WordPress ha subido la versión mínima de PHP a una cosa más moderna, es el momento de seguir su estela y aprovechar para escribir código más moderno. ¿Te animas?

Imagen destacada de Laurent Naville en Unsplash.

FlojaNo está malBienMuy bien¡Impecable! (4 votos, promedio: 4,75 de 5)
Cargando…

2 comentarios en «Bucles en PHP. ¡Es hora de modernizarse!»

  1. ¡Felicidades por el artículo!
    La verdad que entender y conocer bien los arrays es fundamental.

Deja un comentario

No publicaremos tu correo electrónico. Los campos obligatorios están marcados con: •

He leído y acepto la Política de privacidad de Nelio Software

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.