Funciones anónimas (closures) en PHP 5.3

noviembre 5, 2011

Según la documentación oficial de PHP, las funciones anónimas (o closures) permiten la creación de funciones que no tienen un nombre especificado.

Ejemplo sencillo de lo que quiere decir:

$saludo = function($nombre)
{
    printf("Hola %srn", $nombre);
};
 
$saludo('Mundo');
$saludo('PHP');

Pero en este ejemplo vamos a ir un poco más allá.
Imaginemos que tenemos este array:

$usuarios = array(
             array('id' => 1, 'nombre' => 'Jon', 'cumple' => '1984-02-17'),
             array('id' => 2, 'nombre' => 'Luis', 'cumple' => '1985-07-07'),
             array('id' => 3, 'nombre' => 'Antonio', 'cumple' => '1974-11-17')
         );

Si quisiéramos obtener los ids de cada usuario, haríamos algo parecido a esto:

$ids = array();
foreach ($usuarios as $usuario) {
    $ids[] = $usuario['id'];
}

Pero hay una forma mucho más elegante de hacerlo utilizando las funciones anónimas que nos proporciona PHP:

$ids = array_map(function ($usuario) {
    return $usuario['id'];
}, $usuarios);

Mucho más limpio y elegante… Vamos a rizar más el rizo. Ahora queremos obtener los usuario que hayan nacido a partir de 1980. Normalmente haríamos algo así:

$usuarios_filtrados = array();
$fecha_inicial = strtotime('1980-01-01');
foreach ($usuarios as $usuario) {
    if (strtotime($usuario['cumple']) >= $fecha_inicial) {
        $usuarios_filtrados[] = $usuario;
    }
}

En esta ocasión lo haremos utilizando de nuevo las funciones anónimas o closures:

$fecha_inicial = strtotime('1980-01-01');
$usuarios_filtrados = array_filter($usuarios, function($usuario) {
    global $fecha_inicial;
    return strtotime($usuario['cumple']) >= $fecha_inicial;
});

Y esto solo son algunos ejemplos. Las herramientas las tenemos ahí, depende de nosotros si las utilizamos o no 🙂

CompartirTweet about this on TwitterShare on TumblrShare on FacebookShare on LinkedInShare on Google+Email this to someone

Tags ; , , ,

Escribe un comentario

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.