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