当前位置: 首页> 最新文章列表> array_filter() 搭配 array_reduce() 做数据聚合

array_filter() 搭配 array_reduce() 做数据聚合

M66 2025-06-04

在PHP中,array_filter()array_reduce() 函数是非常有用的工具,分别用于对数组进行筛选和聚合操作。它们可以帮助开发者简化代码,提高代码的可读性和效率。本文将通过示例演示如何使用这两个函数来进行数据筛选与聚合。

1. array_filter() 函数简介

array_filter() 函数用于筛选数组中的元素。它接收一个数组和一个回调函数作为参数。回调函数对数组中的每个元素进行判断,若回调函数返回 true,则该元素保留在结果数组中;若返回 false,则该元素被过滤掉。

语法:

array_filter(array $array, callable $callback = null, int $mode = 0): array
  • $array:需要进行筛选的数组。

  • $callback:回调函数,若该函数返回 true,则保留该元素;若返回 false,则移除该元素。如果不传入回调函数,则会移除数组中的所有假值(例如 nullfalse0'' 等)。

  • $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 的数字。可以看到,返回的数组只包含符合条件的元素。

2. array_reduce() 函数简介

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 代表当前数组元素的值。

3. 综合应用:数据筛选与聚合

我们可以结合使用 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() 计算这些筛选后的产品价格总和。

4. 替换 URL 域名示例

假设我们有一个包含一些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);
?>

输出: