李涛自留地
回到顶部
首页 > php学习 > PHP array_reduce() 函数详解:数组归约与聚合

PHP array_reduce() 函数详解:数组归约与聚合

文章目录

最近在处理一段数据处理代码时,发现用 for 循环累加、计数、拼接字符串的代码太丑了。后来了解了array_reduce() 函数,发现它能把这些操作浓缩到几行代码里。

这篇文章把array_reduce()的各种用法、实战场景和注意事项整理出来。

array_reduce()基本用法

array_reduce(array, callback, initial) - 将数组归约成单个值。

<?php
$numbers = [1, 2, 3, 4, 5];

// 求和
$sum = array_reduce($numbers, function($carry, $item) {
    return $carry + $item;
}, 0);
echo $sum;  // 15

// 求乘积
$product = array_reduce($numbers, function($carry, $item) {
    return $carry * $item;
}, 1);
echo $product;  // 120
?>

工作原理

array_reduce()按顺序遍历数组,每次把上一次回调的返回值作为下一次回调的第一个参数($carry):

<?php
// [1, 2, 3, 4, 5] 求和过程
// 第1步: carry=0, item=1  →  0+1=1
// 第2步: carry=1, item=2  →  1+2=3
// 第3步: carry=3, item=3  →  3+3=6
// 第4步: carry=6, item=4  →  6+4=10
// 第5步: carry=10, item=5 →  10+5=15
?>

常见聚合操作

数组去重并统计

<?php
$tags = ['php', 'php', 'python', 'php', 'css', 'python'];

// 统计每个标签出现次数
$counts = array_reduce($tags, function($carry, $tag) {
    $carry[$tag] = ($carry[$tag] ?? 0) + 1;
    return $carry;
}, []);

print_r($counts);
/*
Array
(
    [php] => 3
    [python] => 2
    [css] => 1
)
*/
?>

二维数组提取

<?php
$users = [
    ['id' => 1, 'name' => '张三', 'role' => 'admin'],
    ['id' => 2, 'name' => '李四', 'role' => 'user'],
    ['id' => 3, 'name' => '王五', 'role' => 'admin'],
];

// 提取所有用户名
$names = array_reduce($users, function($carry, $user) {
    $carry[] = $user['name'];
    return $carry;
}, []);
print_r($names);  // ['张三', '李四', '王五']

// 按角色分组
$grouped = array_reduce($users, function($carry, $user) {
    $carry[$user['role']][] = $user['name'];
    return $carry;
}, []);
/*
Array
(
    [admin] => ['张三', '王五'],
    [user] => ['李四']
)
*/
?>

实战场景

场景1:计算平均值

<?php
$scores = [85, 92, 78, 90, 88];

// 计算平均分
$average = array_reduce($scores, function($carry, $score) {
    return $carry + $score;
}, 0) / count($scores);

echo round($average, 2);  // 86.6
?>

场景2:字符串拼接

<?php
$words = ['Hello', 'World', 'PHP'];

// 拼接成句子
$sentence = array_reduce($words, function($carry, $word) {
    return $carry === '' ? $word : $carry . ', ' . $word;
}, '');
echo $sentence;  // Hello, World, PHP
?>

场景3:查找最值

<?php
$temps = [32, 28, 35, 31, 29, 33, 30];

$max = array_reduce($temps, function($carry, $temp) {
    return $temp > $carry ? $temp : $carry;
}, PHP_INT_MIN);

echo '最高温度: ' . $max;  // 35
?>

array_reduce()vsarray_map()对比

函数输入输出用途

array_reduce()数组 → 单个值聚合、统计、求和
array_map()数组 → 数组转换、映射

踩坑提醒

  • initial 参数重要:不传 initial 时,第一次回调的参数是数组前两个元素,而不是数组的第一个元素和空值。

  • 空数组处理:空数组调用array_reduce()返回 initial 值,注意是否符合预期。

  • 性能:回调函数每次都要被调用,大数据量时注意性能。

  • 链式调用:array_reduce()的返回值是单个值,不能继续链式调用数组方法。

  • array_reduce()将数组归约为单个值(求和、计数等)

  • initial 参数指定归约的起点

  • 配合回调函数实现灵活的聚合逻辑

  • 二维数组分组统计的首选函数

若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。