在PHP中,array_filter和array_reduce都是处理数组的强大函数,但它们的用途和工作方式有明显区别。理解这两个函数的差异和使用场景,有助于写出更简洁、高效的代码。
array_filter用于过滤数组元素。它通过一个回调函数检查每个元素,返回值为true的元素会被保留下来,返回false的元素会被移除。简单来说,就是根据条件筛选出符合要求的数组元素。
<?php
$arr = [1, 2, 3, 4, 5, 6];
// 过滤出所有偶数
$result = array_filter($arr, function($value) {
return $value % 2 === 0;
});
print_r($result);
?>
输出结果:
Array ( [1] => 2 [3] => 4 [5] => 6 )
注意:array_filter不会改变元素的键名。
array_reduce用于将数组归约成一个单一的值。它通过回调函数依次将数组元素合并到一个累积值中,适合做累加、求和、拼接字符串等操作。
<?php
$arr = [1, 2, 3, 4, 5];
// 计算数组所有元素的和
$sum = array_reduce($arr, function($carry, $item) {
return $carry + $item;
}, 0);
echo $sum;
?>
输出结果:
15
$carry是累积值,回调会不断更新它,最终返回的就是归约结果。
特点 | array_filter | array_reduce |
---|---|---|
作用 | 过滤数组,返回满足条件的子集 | 将数组“缩减”为一个单一值 |
返回值 | 一个数组 | 一个标量或对象 |
主要用途 | 条件筛选元素 | 聚合、合并、累加 |
保留键名 | 保留 | 不涉及键名,关注值的累计 |
需要从数组中筛选出符合条件的元素时,用array_filter。比如:筛选出所有年龄大于18岁的用户。
需要将数组转换成一个值时,用array_reduce。比如:计算总分、拼接字符串、生成统计数据。
假设有一个订单数组,里面包含多个订单金额。
<?php
$orders = [120, 250, 90, 300, 60];
// 筛选出金额大于100的订单
$filteredOrders = array_filter($orders, function($amount) {
return $amount > 100;
});
// 计算筛选后的订单总金额
$total = array_reduce($filteredOrders, function($carry, $amount) {
return $carry + $amount;
}, 0);
echo "大于100的订单总金额是:" . $total;
?>
通过上述示例,可以清晰地看到array_filter先筛选出符合条件的订单,再用array_reduce进行求和。两者配合使用,可以灵活处理数组数据。
array_filter专注于筛选元素,保留满足条件的数组项。
array_reduce专注于归约合并,将数组“压缩”为一个结果。
根据需求选择,或者组合使用,能让代码更优雅和高效。