Bird
Raised Fist0
PHPprogramming~20 mins

Closures in array functions in PHP - Mini Project: Build & Apply

Choose your learning style10 modes available
Closures in array functions
📖 Scenario: You have a list of product prices in an online store. You want to apply a discount to some products based on their price.
🎯 Goal: Use a closure (anonymous function) with PHP's array_filter and array_map functions to select products above a certain price and apply a discount.
📋 What You'll Learn
Create an array called prices with the exact values: 100, 50, 200, 150, 80
Create a variable called discount_threshold and set it to 100
Use array_filter with a closure to select prices greater than discount_threshold
Use array_map with a closure to apply a 10% discount to the filtered prices
Print the resulting discounted prices array
💡 Why This Matters
🌍 Real World
Online stores often need to apply discounts to products based on price or other conditions. Using closures with array functions helps write clean and reusable code.
💼 Career
Understanding closures and array functions is important for PHP developers working on e-commerce sites, data processing, and backend logic.
Progress0 / 4 steps
1
Create the prices array
Create an array called prices with these exact values: 100, 50, 200, 150, 80.
PHP
Hint

Use square brackets [] to create the array with the exact numbers inside.

2
Set the discount threshold
Create a variable called discount_threshold and set it to 100.
PHP
Hint

Just assign the number 100 to the variable $discount_threshold.

3
Filter prices above the threshold
Use array_filter with a closure to create a new array called filtered_prices that contains only prices greater than discount_threshold. Use function($price) use ($discount_threshold) as the closure.
PHP
Hint

The closure needs to access $discount_threshold using use keyword.

4
Apply discount and print results
Use array_map with a closure to create a new array called discounted_prices by applying a 10% discount to each price in filtered_prices. Then print discounted_prices using print_r.
PHP
Hint

Multiply each price by 0.9 to apply a 10% discount. Use print_r to display the array.

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