Bird
Raised Fist0
PHPprogramming~10 mins

Closures in array functions in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Closures in array functions
Define array
↓
Define closure function
↓
Pass closure to array function
↓
Array function calls closure on each element
↓
Closure processes element and returns result
↓
Array function collects results
↓
Output final array
This flow shows how a closure (anonymous function) is defined and passed to an array function, which calls it on each element and collects the results.
Execution Sample
PHP
<?php
$numbers = [1, 2, 3, 4];
$squares = array_map(function($n) { return $n * $n; }, $numbers);
print_r($squares);
?>
This code uses a closure with array_map to square each number in the array.
Execution Table
StepArray ElementClosure InputClosure OutputCollected Result
1111[1]
2224[1, 4]
3339[1, 4, 9]
44416[1, 4, 9, 16]
Exit---All elements processed, array_map returns final array
💡 All elements processed, array_map returns final array
Variable Tracker
VariableStartAfter 1After 2After 3After 4Final
$numbers[1, 2, 3, 4][1, 2, 3, 4][1, 2, 3, 4][1, 2, 3, 4][1, 2, 3, 4][1, 2, 3, 4]
$n (closure input)-1234-
Closure output-14916-
$squares[][1][1, 4][1, 4, 9][1, 4, 9, 16][1, 4, 9, 16]
Key Moments - 3 Insights
Why does the closure receive each element of the array one by one?
Because array_map calls the closure on each element individually, as shown in the execution_table rows 1 to 4.
What happens if the closure does not return a value?
array_map will collect null for that element, so the output array will have nulls in those positions.
Is the original array modified by array_map?
No, the original array ($numbers) stays the same, array_map returns a new array ($squares) as shown in variable_tracker.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the closure output when the array element is 3?
A9
B6
C3
DNone
💡 Hint
Check step 3 in the execution_table where Array Element is 3.
At which step does the collected result first contain the value 4?
AAfter step 1
BAfter step 3
CAfter step 2
DAfter step 4
💡 Hint
Look at the Collected Result column in execution_table after each step.
If the closure returned $n + 1 instead of $n * $n, what would be the collected result after step 4?
A[1, 4, 9, 16]
B[2, 3, 4, 5]
C[1, 2, 3, 4]
D[0, 1, 2, 3]
💡 Hint
Think about adding 1 to each element instead of squaring it, then check variable_tracker for original values.
Concept Snapshot
Closures in array functions:
- Define an anonymous function (closure) inline.
- Pass it to array functions like array_map.
- The closure runs on each array element.
- array_map collects and returns new array of results.
- Original array stays unchanged.
Full Transcript
This visual trace shows how closures work with array functions in PHP. We start with an array of numbers. We define a closure that squares a number. We pass this closure to array_map, which calls it on each element one by one. Each closure call takes the element as input and returns its square. array_map collects these results into a new array. The original array remains unchanged. The execution table tracks each step, showing input, output, and collected results. The variable tracker shows how variables change after each step. Key moments clarify common confusions about closure inputs, return values, and array immutability. The quiz tests understanding by referencing the execution steps and variable states.

Practice

(1/5)
1. What is the main purpose of using a closure inside PHP array functions like array_map or array_filter?
easy
A. To define a small, unnamed function that processes array elements inline
B. To declare a global variable accessible inside the array
C. To create a new array without any function
D. To convert arrays into strings automatically

Solution

  1. Step 1: Understand what a closure is

    A closure is a small, unnamed function that can be used directly where needed.
  2. Step 2: Role in array functions

    Closures let you write the logic for processing each array element inline, making code concise and clear.
  3. Final Answer:

    To define a small, unnamed function that processes array elements inline -> Option A
  4. Quick Check:

    Closure = small inline function [OK]
Hint: Closures are small functions used directly inside array calls [OK]
Common Mistakes:
  • Thinking closures declare global variables
  • Confusing closures with array conversion functions
  • Assuming closures create arrays without functions
2. Which of the following is the correct syntax to use a closure with array_filter to keep only even numbers from an array $numbers?
easy
A. array_filter($numbers, function $n { return $n % 2 == 0; });
B. array_filter($numbers, function($n) { return $n % 2 == 0; });
C. array_filter($numbers, function($n) => $n % 2 == 0;);
D. array_filter($numbers, function($n) { $n % 2 == 0; });

Solution

  1. Step 1: Check closure syntax

    Correct closure syntax uses function($param) { return expression; }.
  2. Step 2: Validate each option

    array_filter($numbers, function($n) { return $n % 2 == 0; }); uses correct syntax with return statement. array_filter($numbers, function $n { return $n % 2 == 0; }); misses parentheses. array_filter($numbers, function($n) => $n % 2 == 0;); uses arrow syntax incorrectly. array_filter($numbers, function($n) { $n % 2 == 0; }); lacks return keyword.
  3. Final Answer:

    array_filter($numbers, function($n) { return $n % 2 == 0; }); -> Option B
  4. Quick Check:

    Closure syntax needs parentheses and return [OK]
Hint: Closures need parentheses and return keyword inside curly braces [OK]
Common Mistakes:
  • Omitting parentheses around parameters
  • Using arrow syntax incorrectly in PHP 7+
  • Forgetting to return a value inside closure
3. What will be the output of the following PHP code?
$nums = [1, 2, 3, 4];
$result = array_map(function($x) { return $x * 3; }, $nums);
print_r($result);
medium
A. [0, 3, 6, 9]
B. [1, 2, 3, 4]
C. [3, 6, 9, 12]
D. Syntax error

Solution

  1. Step 1: Understand array_map with closure

    array_map applies the closure to each element, multiplying by 3.
  2. Step 2: Calculate each element

    1*3=3, 2*3=6, 3*3=9, 4*3=12, so result is [3, 6, 9, 12].
  3. Final Answer:

    [3, 6, 9, 12] -> Option C
  4. Quick Check:

    Multiply each by 3 = [3,6,9,12] [OK]
Hint: array_map applies closure to each element and returns new array [OK]
Common Mistakes:
  • Expecting original array unchanged
  • Confusing array_map with array_filter
  • Thinking output is a string, not array
4. Identify the error in this PHP code using a closure with array_filter:
$values = [10, 15, 20];
$filtered = array_filter($values, function($v) {
  if ($v > 10) {
    return true;
  }
});
print_r($filtered);
medium
A. The closure does not return false for values <= 10, causing unexpected filtering
B. The array_filter function requires a named function, not a closure
C. The array_filter call is missing the array parameter
D. The closure syntax is invalid without a semicolon after return

Solution

  1. Step 1: Analyze closure return behavior

    The closure returns true only if value > 10, but returns nothing (null) otherwise.
  2. Step 2: Understand array_filter behavior

    array_filter expects explicit boolean returns. Returning implicit null (falsy) for values <=10 removes them but can cause unexpected filtering behavior.
  3. Final Answer:

    The closure does not return false for values <= 10, causing unexpected filtering -> Option A
  4. Quick Check:

    Closure must return true or false explicitly [OK]
Hint: Always return true or false explicitly in closures for array_filter [OK]
Common Mistakes:
  • Not returning false explicitly in closure
  • Thinking closures must be named functions
  • Missing array parameter in array_filter
5. Given an array $data = [1, 2, 3, 4, 5, 6], how can you use a closure with array_filter and array_map together to get an array of squares of only the odd numbers?
hard
A. array_filter(fn($x) => $x % 2 !== 0, array_map($data, fn($x) => $x * $x));
B. array_filter(array_map($data, fn($x) => $x * $x), fn($x) => $x % 2 !== 0);
C. array_map(array_filter($data, fn($x) => $x % 2 !== 0), fn($x) => $x * $x);
D. array_map(fn($x) => $x * $x, array_filter($data, fn($x) => $x % 2 !== 0));

Solution

  1. Step 1: Filter odd numbers first

    Use array_filter with closure to keep only odd numbers: fn($x) => $x % 2 !== 0.
  2. Step 2: Map squares of filtered numbers

    Apply array_map with closure to square each filtered number: fn($x) => $x * $x.
  3. Step 3: Combine calls correctly

    Pass filtered array as second argument to array_map, so filtering happens before mapping.
  4. Final Answer:

    array_map(fn($x) => $x * $x, array_filter($data, fn($x) => $x % 2 !== 0)); -> Option D
  5. Quick Check:

    Filter odds then map squares [OK]
Hint: Filter first, then map to transform filtered results [OK]
Common Mistakes:
  • Reversing order of array_map and array_filter
  • Passing arguments in wrong order
  • Using array_map or array_filter with wrong parameter order
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard