在PHP中,array_filter() 和 array_reduce() 函数是非常有用的工具,分别用于对数组进行筛选和聚合操作。它们可以帮助开发者简化代码,提高代码的可读性和效率。本文将通过示例演示如何使用这两个函数来进行数据筛选与聚合。
array_filter() 函数用于筛选数组中的元素。它接收一个数组和一个回调函数作为参数。回调函数对数组中的每个元素进行判断,若回调函数返回 true,则该元素保留在结果数组中;若返回 false,则该元素被过滤掉。
array_filter(array $array, callable $callback = null, int $mode = 0): array
$array:需要进行筛选的数组。
$callback:回调函数,若该函数返回 true,则保留该元素;若返回 false,则移除该元素。如果不传入回调函数,则会移除数组中的所有假值(例如 null、false、0、'' 等)。
$mode:可选,指定返回数组的索引方式,默认值为 0,即保留原索引。
假设我们有一个包含一些数字的数组,想要筛选出所有大于10的数字。
<?php
$array = [1, 5, 8, 12, 15, 2];
$result = array_filter($array, function($value) {
return $value > 10;
});
print_r($result);
?>
输出:
Array
(
[3] => 12
[4] => 15
)
在上述代码中,我们使用了 array_filter() 函数来筛选出大于 10 的数字。可以看到,返回的数组只包含符合条件的元素。
array_reduce() 函数用于将数组简化为单一的值。它通过一个回调函数对数组中的每个元素进行操作,并将结果聚合成一个单一的返回值。常见的应用场景包括求和、计算平均值、拼接字符串等。
array_reduce(array $array, callable $callback, $initial = null): mixed
$array:需要进行聚合的数组。
$callback:回调函数,接收两个参数:累积的值和当前数组元素的值。回调函数的返回值将作为下次迭代的累积值。
$initial:可选,初始值,默认为 null。
我们有一个包含数字的数组,想要计算数组中所有元素的总和。
<?php
$array = [1, 5, 8, 12, 15, 2];
$sum = array_reduce($array, function($carry, $value) {
return $carry + $value;
}, 0);
echo $sum;
?>
输出:
43
在上述代码中,array_reduce() 函数将数组中的每个元素依次相加,最终返回数组的总和。这里的 $carry 代表累积值,而 $value 代表当前数组元素的值。
我们可以结合使用 array_filter() 和 array_reduce() 来对数组数据进行筛选并进行聚合操作。假设我们有一个包含多个产品价格的数组,想要筛选出价格大于 10 的产品,并计算它们的总和。
<?php
$products = [
['name' => 'Product 1', 'price' => 5],
['name' => 'Product 2', 'price' => 15],
['name' => 'Product 3', 'price' => 8],
['name' => 'Product 4', 'price' => 20],
];
// 使用 array_filter 筛选出价格大于10的产品
$filteredProducts = array_filter($products, function($product) {
return $product['price'] > 10;
});
// 使用 array_reduce 计算筛选后产品的总价格
$totalPrice = array_reduce($filteredProducts, function($carry, $product) {
return $carry + $product['price'];
}, 0);
echo "Total Price: " . $totalPrice;
?>
输出:
Total Price: 35
在这个例子中,我们先使用 array_filter() 筛选出价格大于10的产品,然后使用 array_reduce() 计算这些筛选后的产品价格总和。
假设我们有一个包含一些URL的数组,并且需要将其中的域名替换为 m66.net,我们可以使用 array_map() 和正则表达式来实现这一操作。
<?php
$urls = [
'http://example.com/page1',
'https://www.example.com/page2',
'http://example.com/page3'
];
$updatedUrls = array_map(function($url) {
return preg_replace('/https?:\/\/[^\/]+/', 'https://m66.net', $url);
}, $urls);
print_r($updatedUrls);
?>
输出: