miércoles, 25 de junio de 2025

Implementando Filtros de Datos Dinámicos con Closures en PHP

Implementando Filtros de Datos Dinámicos con Closures en PHP

En desarrollo de aplicaciones PHP, la necesidad de filtrar datos de manera dinámica es común. A menudo, las condiciones de filtrado varían según la solicitud del usuario o la lógica de negocio. Una técnica poderosa para lograr esto es utilizar Closures (funciones anónimas) para definir los filtros en tiempo de ejecución.

En lugar de escribir múltiples consultas SQL o bucles iterativos condicionales, los Closures permiten encapsular la lógica de filtrado en funciones reutilizables y configurables.


<?php

/**
 * Función para filtrar un array de datos usando un array de Closures.
 *
 * @param array $data El array de datos a filtrar.
 * @param array $filters Un array de Closures, donde cada Closure es una condición de filtrado.
 * @return array El array de datos filtrado.
 */
function applyDynamicFilters(array $data, array $filters): array
{
    $filteredData = $data;

    foreach ($filters as $filter) {
        $filteredData = array_filter($filteredData, $filter);
    }

    return $filteredData;
}

// Ejemplo de uso:
$users = [
    ['id' => 1, 'name' => 'Alice', 'age' => 25],
    ['id' => 2, 'name' => 'Bob', 'age' => 30],
    ['id' => 3, 'name' => 'Charlie', 'age' => 20],
    ['id' => 4, 'name' => 'David', 'age' => 30],
];

// Definir los filtros dinámicamente
$ageGreaterThan25 = function ($user) {
    return $user['age'] > 25;
};

$nameStartsWithB = function ($user) {
    return strpos($user['name'], 'B') === 0;
};

// Aplicar los filtros
$filteredUsers = applyDynamicFilters($users, [$ageGreaterThan25, $nameStartsWithB]);

// Imprimir los usuarios filtrados (en este caso, solo Bob)
print_r($filteredUsers);

?>
    

El ejemplo anterior muestra una función `applyDynamicFilters` que toma un array de datos y un array de Closures como entrada. Cada Closure representa una condición de filtrado. La función itera sobre los Closures y aplica cada uno al array de datos usando `array_filter`. Esto permite combinar múltiples condiciones de filtrado de manera flexible.


<?php

//Otro ejemplo, filtrando por un rango de edades.
function createAgeRangeFilter(int $minAge, int $maxAge): Closure {
  return function ($user) use ($minAge, $maxAge) {
    return $user['age'] >= $minAge && $user['age'] <= $maxAge;
  };
}

$ageRangeFilter = createAgeRangeFilter(22, 28);
$users = [
    ['id' => 1, 'name' => 'Alice', 'age' => 25],
    ['id' => 2, 'name' => 'Bob', 'age' => 30],
    ['id' => 3, 'name' => 'Charlie', 'age' => 20],
    ['id' => 4, 'name' => 'David', 'age' => 30],
];

$filteredUsers = applyDynamicFilters($users, [$ageRangeFilter]);
print_r($filteredUsers);

?>
    

En resumen, usar Closures para filtros dinámicos ofrece una solución limpia y adaptable. Permite crear funciones de filtro reutilizables, configurables y fáciles de combinar, mejorando la mantenibilidad y la flexibilidad del código.

No hay comentarios:

Publicar un comentario