PHP array_reduce() 函数详解:数组归约与聚合
- 2026年7月3日
- 103 次
文章目录
最近在处理一段数据处理代码时,发现用 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()对比
函数输入输出用途
<?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()对比
函数输入输出用途
<?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
?>
<?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()对比
函数输入输出用途
<?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()数组 → 单个值聚合、统计、求和
array_map()数组 → 数组转换、映射
踩坑提醒
-
initial 参数重要:不传 initial 时,第一次回调的参数是数组前两个元素,而不是数组的第一个元素和空值。
-
空数组处理:空数组调用array_reduce()返回 initial 值,注意是否符合预期。
-
性能:回调函数每次都要被调用,大数据量时注意性能。
-
链式调用:array_reduce()的返回值是单个值,不能继续链式调用数组方法。
-
array_reduce()将数组归约为单个值(求和、计数等)
-
initial 参数指定归约的起点
-
配合回调函数实现灵活的聚合逻辑
-
二维数组分组统计的首选函数
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- 上一篇: PHP in_array()、array_search()、array_key_exists() 查找函数对比
- 下一篇: PHP array_walk() 函数详解:给数组每个元素套上自定义逻辑
- box-shadow在前端中有什么作用?box-shadow在Css3中怎么使用? 2022-11-01
- Nginx 504 Gateway Timeout超时详解:原因与优化方案 2026-07-02
- PHP数组去重函数array_unique()怎么用 PHP数组去重函数使用实例 2022-11-14
- PHP构造方法使用学习笔记 PHP构造方法实例代码 2022-12-03
- PHP数组常用函数之指针函数用法及实例代码 2022-10-26
- PHP内置时间函数strtotime()语法用法和实例代码 2022-10-16
