Anonymous functions are available from PHP 5.3 (2009).
Anonymous functions are useful when using functions that require a callback function like array_filter or array_map do:
$arr = range(0, 10); $arr_even = array_filter($arr, function($val) { return $val % 2 == 0; }); $arr_square = array_map(function($val) { return $val * $val; }, $arr);
// The function doesn't need to be assigned to a variable. This is valid too: $arr_even = array_filter($arr, function($val) { return $val % 2 == 0; });
Otherwise you would need to define a function that you possibly only use once:
function isEven($val) { return $val % 2 == 0; } $arr_even = array_filter($arr, 'isEven'); function square($val) { return $val * $val; } $arr_square = array_map('square', $arr);
The lambda function is an anonymous PHP function that can be stored in a variable and passed as an argument to other functions or methods. A closure is a lambda function that is aware of its surrounding context.
The lambda functions and closures are often used with the array_map(), array_reduce(), and array_filter() functions:
$input = array(1, 2, 3, 4, 5); $output = array_filter($input, function ($v) { return $v > 2; });
The above example filters the input array by removing all values greater than 2:
$output == array(2 => 3, 3 => 4, 4 => 5)
function ($v) { return $v > 2; } is the lambda function definition and it can be stored in a PHP variable to be reusable:
$max_comparator = function ($v) { return $v > 2; }; $input = array(1, 2, 3, 4, 5); $output = array_filter($input, $max_comparator);
But what if I want to change the maximum number allowed in the filtered array? I can either create another lambda function or use a closure:
$max_comparator = function ($max) { return function ($v) use ($max) { return $v > $max; }; }; $input = array(1, 2, 3, 4, 5); $output = array_filter($input, $max_comparator(2));
Now, the $max_comparator function takes the maximum allowed number and returns a function that is different according to this maximum.