0

0

PHP array_reduce 函数原理与实战解析

舞夢輝影

舞夢輝影

发布时间:2026-03-08 17:37:03

|

405人浏览过

|

来源于php中文网

原创

array_reduce的核心作用是将数组折叠为单一值,通过回调函数累积计算,不修改原数组;它从左到右遍历,以初始值或首元素为起点,依次合并当前项与累积值。

php array_reduce 函数原理与实战解析

array_reduce 的核心作用是把数组“压缩”成一个单一值,靠的是你提供的回调函数一次次累积计算——它不改变原数组,只返回最终结果。

工作原理:从左到右逐个“折叠”

array_reduce 按顺序遍历数组,每次把“上一次的结果”和“当前元素”传给回调函数,再用返回值作为下一轮的“上一次结果”。第一次调用时,若未指定初始值,就用第一个元素当“上一次结果”,从第二个元素开始处理。

  • 空数组且没给初始值 → 返回 null
  • 空数组但给了初始值 → 直接返回该初始值
  • 单元素数组且没给初始值 → 不进回调,直接返回该元素
  • 回调函数必须接收两个参数:$carry(累积值)和 $item(当前项)

常见用途与写法示例

求和、拼接、找最大值、统计频次……这些都可以用 array_reduce 实现,关键是设计好累积逻辑。

PHP5 和 MySQL 圣经
PHP5 和 MySQL 圣经

本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。

下载
  • // 求和
    $sum = array_reduce([1,2,3,4], function($carry, $item) { return $carry + $item; }); // 10
  • // 字符串拼接(加分隔符)
    $str = array_reduce(['a','b','c'], function($carry, $item) { return $carry === '' ? $item : $carry . '-' . $item; }, ''); // "a-b-c"
  • // 统计单词出现次数
    $words = ['apple', 'banana', 'apple', 'cherry'];
    $count = array_reduce($words, function($carry, $word) {
      $carry[$word] = ($carry[$word] ?? 0) + 1;
      return $carry;
    }, []); // ['apple'=>2, 'banana'=>1, 'cherry'=>1]

注意回调中的 $carry 初始化时机

初始值(第三个参数)不是可选的“锦上添花”,而是控制逻辑起点的关键。漏掉它,可能让代码在空数组或单元素时行为异常。

立即学习PHP免费学习笔记(深入)”;

  • 想确保总有数组返回?初始值设为 []
  • 想确保总有数字?初始值设为 0(或 0.0)
  • 字符串操作建议显式传 '',避免 null 参与拼接导致意外
  • 复杂结构(如对象、嵌套数组)也应提供合理初始状态,否则 $carry 第一次可能是 null

对比 foreach:何时选 reduce?

不是所有聚合都要用 array_reduce。它适合逻辑清晰、纯函数式表达的场景;如果中间要 break、continue、做条件跳过,或者需多次修改同一变量,foreach 更直观可控。

  • ✅ 适合:无副作用、每步只依赖前值和当前项、语义明确(如“把所有数加起来”)
  • ❌ 少用:需要提前退出、依赖外部变量、步骤间有复杂分支判断
  • ? 提示:写完 reduce 后读一遍回调,如果能自然说出“用上一个结果和当前项算出下一个结果”,那它就用对了

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

253

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

225

2025.12.04

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号