PHP's array_reduce is not only for outputting single values
PHP's array_reduce is a simple way to partition a set of data or return a single value. It is super powerful and worth spending time learning.
Sometimes we need to partition our data, which can be done in many ways. In this article I'll show you how to do this using PHP's array_reduce function.
First lets look at parameters that you can pass the function.
- The first parameter should always be an array.
- The second parameter is a call back function, which is where all the magic will happen.
- The third, optional, parameter is where we set the initial value.
First let's look at the basic usage by adding up an array of numbers.
You can also use
array_sum, but for the purposes of this tutorial we'll usearray_reduce
$numbers = [1, 3, 9, 12, 15, 18, 21];
$result = array_reduce($numbers, function($carry, $number) {
return $carry + $number;
}, 0);
Our result would be 79 as expected.
Next we'll look at splitting up the numbers array into 2 groups. Small numbers being anything under 10, and large numbers being 10 and over.
$numbers = [1, 3, 9, 12, 15, 18, 21];
$result = [
'small' => [],
'large' => [],
];
$result = array_reduce($numbers, function($carry, $number) {
if($number >= 10) {
array_push($carry['large'], $number);
}
if($number < 10) {
array_push($carry['small'], $number);
}
return $carry;
}, $result);
The output of $result would be the following as we expect:
Array
(
[small] => Array
(
[0] => 1
[1] => 3
[2] => 9
)
[large] => Array
(
[0] => 12
[1] => 15
[2] => 18
[3] => 21
)
)
Lastly, we'll take another example of taking a group of users and splitting them up by gender.
$users = [
['name' => 'Frank', 'gender' => 'Male'],
['name' => 'Michael', 'gender' => 'Male'],
['name' => 'David', 'gender' => 'Male'],
['name' => 'Jabari', 'gender' => 'Male'],
['name' => 'Sarah', 'gender' => 'Female'],
['name' => 'Jessy', 'gender' => 'Female'],
['name' => 'Tracey', 'gender' => 'Female'],
];
$usersByGender = array_reduce(
$users,
function($groups, $user) {
if($user['gender'] === 'Male') {
array_push($groups['male'], $user);
}
if($user['gender'] === 'Female') {
array_push($groups['female'], $user);
}
return $groups;
},
[
'male' => [],
'female' => [],
]
);
As expected our output would be the following:
Array
(
[male] => Array
(
[0] => Array
(
[name] => Frank
[gender] => Male
)
[1] => Array
(
[name] => Michael
[gender] => Male
)
[2] => Array
(
[name] => David
[gender] => Male
)
[3] => Array
(
[name] => Jabari
[gender] => Male
)
)
[female] => Array
(
[0] => Array
(
[name] => Sarah
[gender] => Female
)
[1] => Array
(
[name] => Jessy
[gender] => Female
)
[2] => Array
(
[name] => Tracey
[gender] => Female
)
)
)