Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP多维数组分组统计:嵌套循环与变量递增重置技巧_创想鸟

PHP多维数组分组统计:嵌套循环与变量递增重置技巧

PHP多维数组分组统计:嵌套循环与变量递增重置技巧

本教程探讨了如何在php处理多维数组时,通过嵌套循环实现按特定键(组)进行变量递增与重置,从而完成分组统计的需求。文章详细介绍了使用foreach循环结合计数器变量,在内层循环累加,在外层循环结束后记录结果并重置计数器的实用方法,避免了简单的全局求和,确保了数据按组准确聚合。

引言:理解分组统计的需求

在处理复杂数据结构时,我们经常会遇到需要对数据进行分组统计的场景。例如,在一个包含多个供应商订单的多维数组中,我们可能需要计算每个供应商的总商品数量,而不是所有供应商的商品总和。这种“按组统计”的需求,要求我们在遍历数据时,能够为每个组维护一个独立的计数器,并在组切换时进行累加和重置。直接对整个集合进行求和操作,往往无法满足这种精细化的分组统计要求。

原始数据结构示例

假设我们有一个多维数组,其结构如下所示。这个数组的顶级键代表供应商ID(例如1和2),每个顶级键对应的值又是一个包含该供应商下所有商品详情的数组。每个商品详情包含supplier_id、child_product_id、quantity和shipping_cost等信息。

$data = [    1 => [ // 供应商ID 1        [            "supplier_id" => 1,            "child_product_id" => 54634,            "quantity" => 2,            "shipping_cost" => "4.99"        ],        [            "supplier_id" => 1,            "child_product_id" => 24723,            "quantity" => 1,            "shipping_cost" => "4.99"        ]    ],    2 => [ // 供应商ID 2        [            "supplier_id" => 2,            "child_product_id" => 19533,            "quantity" => 1,            "shipping_cost" => "18.00"        ]    ]];

我们的目标是计算每个供应商(即每个顶级键)的总商品数量。例如,对于供应商ID为1的组,总数量应为2 + 1 = 3;对于供应商ID为2的组,总数量应为1。

核心解决方案:嵌套foreach循环

解决此类分组统计问题的有效且直观的方法是使用嵌套的foreach循环。这种方法允许我们逐层遍历多维数组,并在适当的时机累加和重置计数器。

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

其基本原理如下:

外层循环: 遍历多维数组的顶级键(在本例中是供应商ID)。每次迭代都代表开始处理一个新的分组。内层循环: 遍历当前分组(即当前供应商)下的所有子项(商品)。在此循环中,我们对每个子项的特定属性(quantity)进行累加。计数器变量: 引入一个临时变量(例如$currentGroupQuantity)作为计数器,在内层循环中累加当前分组的数值。结果存储: 引入一个数组(例如$aggregatedQuantities)来存储每个分组的最终统计结果。重置机制: 在内层循环完成,即一个分组的所有子项都被处理完毕后,将当前分组的累加结果存储到结果数组中,并将计数器重置为零,为下一个外层循环(即下一个分组)的统计做准备。

实现代码示例

以下是根据上述原理实现的PHP代码示例:

 [        [            "supplier_id" => 1,            "child_product_id" => 54634,            "quantity" => 2,            "shipping_cost" => "4.99"        ],        [            "supplier_id" => 1,            "child_product_id" => 24723,            "quantity" => 1,            "shipping_cost" => "4.99"        ]    ],    2 => [        [            "supplier_id" => 2,            "child_product_id" => 19533,            "quantity" => 1,            "shipping_cost" => "18.00"        ]    ]];// 初始化一个计数器变量,用于累加每个分组的数量$currentGroupQuantity = 0;// 初始化一个数组,用于存储每个分组的最终统计结果$aggregatedQuantities = [];// 外层循环:遍历每个供应商分组foreach ($data as $supplierId => $products) {    // 内层循环:遍历当前供应商下的所有商品    foreach ($products as $product) {        // 累加当前商品的数量到计数器        $currentGroupQuantity += $product['quantity'];    }    // 内层循环结束后,将当前供应商的总数量存储到结果数组中    // 键为供应商ID,值为总数量    $aggregatedQuantities[$supplierId] = $currentGroupQuantity;    // 重置计数器,为下一个供应商的统计做准备    $currentGroupQuantity = 0;}// 输出最终结果echo "
";print_r($aggregatedQuantities);echo "

";/*预期输出:Array( [1] => 3 [2] => 1)*/?>

代码解析

$currentGroupQuantity = 0;: 在所有循环开始之前,初始化一个名为$currentGroupQuantity的变量。这个变量将临时存储当前正在处理的供应商的总商品数量。$aggregatedQuantities = [];: 初始化一个空数组$aggregatedQuantities,用于存放最终的统计结果。键将是供应商ID,值将是对应的总数量。foreach ($data as $supplierId => $products): 这是外层循环。它遍历 $data 数组的每一个顶级元素。$supplierId 会依次取到 1 和 2,$products 会取到对应供应商下的商品数组。foreach ($products as $product): 这是内层循环。对于每个供应商(外层循环的每次迭代),这个循环会遍历该供应商下的所有商品。$product 变量在每次迭代中都会得到一个商品详情数组。$currentGroupQuantity += $product['quantity'];: 在内层循环中,我们将当前商品的quantity值累加到$currentGroupQuantity变量中。$aggregatedQuantities[$supplierId] = $currentGroupQuantity;: 当内层循环完成(即一个供应商的所有商品都已累加完毕)时,我们将$currentGroupQuantity的值赋给$aggregatedQuantities数组中以当前$supplierId为键的位置。这表示我们已经完成了对当前供应商的统计。$currentGroupQuantity = 0;: 关键步骤。在将结果存储到$aggregatedQuantities之后,立即将$currentGroupQuantity重置为0。这样做是为了确保下一个供应商的商品数量统计是从零开始,避免将前一个供应商的数量错误地累加进去。

注意事项与最佳实践

数据结构一致性: 确保你的输入数组结构与代码中预期的结构一致。如果内部的商品详情不是数组而是对象,你需要将$product['quantity']改为$product->quantity。

变量命名: 使用清晰、有意义的变量名(如$currentGroupQuantity、$aggregatedQuantities、$supplierId、$products、$product)可以大大提高代码的可读性和可维护性。

初始化: 在使用计数器和结果存储数组之前,务必进行初始化,以避免潜在的错误或警告。

Laravel Collections的替代方案: 如果你在Laravel框架下工作,可以使用其强大的Collection API来实现类似的功能,代码可能更简洁:

use IlluminateSupportCollection;$dataCollection = collect($data); // 将原始数组转换为集合$aggregatedQuantities = $dataCollection->mapWithKeys(function (Collection $products, $supplierId) {    // 对于每个供应商分组,计算其下所有商品的quantity总和    return [$supplierId => $products->sum('quantity')];});// $aggregatedQuantities 现在是一个包含分组总量的集合// 可以通过 $aggregatedQuantities->toArray() 转换为数组

这种方式利用了mapWithKeys方法来遍历顶级键值对,并对每个值(即内部商品集合)应用sum()方法,实现了相同的功能,且代码更具表现力。

总结

通过本教程,我们学习了如何利用嵌套的foreach循环结合计数器变量,在PHP中高效地实现多维数组的按键分组统计。理解数据结构、正确管理计数器的累加与重置时机是解决此类问题的关键。无论是使用原生PHP的循环结构,还是借助如Laravel Collection这样的高级API,掌握这种分组统计的逻辑对于处理复杂数据集都至关重要。

以上就是PHP多维数组分组统计:嵌套循环与变量递增重置技巧的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1324533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP命令怎么执行版本控制操作_PHP命令行Git/SVN操作
上一篇 2025年12月12日 11:11:45
Laravel 中保存多个关联模型:高效方法与最佳实践
下一篇 2025年12月12日 11:12:00

相关推荐

  • Laravel应用的安全审计(Security Audit)方法

    进行安全审计对laravel应用至关重要,因为它能发现并修复安全漏洞,提升整体安全性和用户信任度。具体方法包括:1. 代码审查,确保无未过滤输入和弱密码;2. 配置文件安全性,保护敏感信息;3. 依赖管理,更新第三方包;4. 用户认证和授权,防止未授权访问;5. 日志和监控,检测异常行为。 在讨论L…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的全面指南

    本文深入探讨了 Laravel 8 中用户登录后重定向到仪表盘的多种策略。我们将详细解析默认的重定向机制,包括 LoginController 和 RedirectIfAuthenticated 中间件,并重点介绍如何通过自定义登录逻辑实现精确的重定向控制,同时提供示例代码和常见问题排查建议,确保用…

    2026年9月21日
    000
  • Guava Multimap:高效获取并打印指定键的所有关联值

    guava multimap是处理一键多值映射关系的强大工具。要获取特定键的所有关联值,应直接使用其提供的`multimap#get(k)`方法。该方法会返回一个包含所有匹配值的`collection`,即使键不存在,也会返回一个空集合而非`null`,从而简化了值检索和空值处理逻辑,是比手动迭代键…

    2026年9月21日
    000
  • VSCode的括号匹配功能如何自定义?

    可通过 settings.json 自定义括号高亮的边框和背景色;2. 用 editor.matchBrackets 控制是否启用高亮;3. 启用 bracketPairColorization 可为嵌套括号着色;4. 使用 Ctrl/Cmd + Shift + 快速跳转配对括号。 VSCode 的…

    2026年9月21日
    000
  • 小可AI小程序入口链接_小可AI小程序官方地址

    小可AI小程序官方入口为https://xcx.xiaokeai.com.cn,用户可在社交平台搜索使用;平台支持多轮对话、文本生成、图像理解及语音转文字功能,界面简洁、响应迅速,具备历史记录查看与持续优化的智能算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    000
  • Bing搜索主页官方地址_Bing搜索官方网站登录网址

    Bing搜索主页官方地址是https://www.bing.com/,页面布局简洁,顶部为搜索框,下方展示个性化信息模块,并每日更新全球高清背景图片。 Bing搜索主页官方地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Bing搜索官方网站登录网址,感兴趣的网友一起随小编来瞧瞧吧! h…

    2026年9月21日
    000
  • Bing搜索最新官方网址入口 Bing搜索在线使用官网主页直达

    Bing搜索最新官方网址入口是https://www.bing.com,该网站提供每日更新的高清背景图片、简洁的页面布局、深色模式切换及个性化主页定制等视觉体验功能。 Bing搜索最新官方网址入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Bing搜索在线使用官网主页直达,感兴趣的网友…

    2026年9月21日
    100
  • VSCode的代码格式化快捷键是什么?

    VSCode代码格式化快捷键为Shift+Alt+F(Windows/Linux)或Shift+Option+F(macOS),需安装对应语言的格式化工具;若无效,可能是未安装扩展、文件类型不支持或快捷键冲突;可右键选择“格式化文档”或通过命令面板执行,也可在键盘快捷方式中自定义。 VSCode的代…

    2026年9月21日
    000
  • poki游戏在线网站 poki热门小游戏在线畅玩

    Poki热门小游戏包括《地铁跑酷》《愤怒的小鸟经典版》《Stick先生史诗般的生存》等,涵盖动作、体育、益智等多种类型,支持网页端免下载即玩,适配多设备,无需注册即可畅玩,定期更新并设有实时热门榜单,适合各年龄段玩家在线娱乐。 Poki游戏在线网站热门小游戏有哪些?这是不少网友都关注的,接下来由PH…

    2026年9月21日
    000
  • mac怎么用命令行定时关机_Mac命令行定时关机方法

    使用shutdown命令可设定Mac在指定时间或相对分钟后关机;2. 通过pmset命令能创建每周重复的定时关机任务;3. 可用pmset -g sched查看计划,sudo pmset repeat cancel取消重复任务,kill终止一次性关机。 如果您希望在离开电脑后让Mac在特定时间自动关…

    2026年9月21日
    100
  • Linux如何查看默认网关

    使用ip route命令可查看默认网关,如ip route | grep default显示default via 192.168.1.1 dev eth0,其中192.168.1.1为网关地址。 在Linux系统中,查看默认网关是网络排查中的常见操作。可以通过命令行工具快速获取当前系统的默认路由信…

    2026年9月21日
    200
  • 如何在Laravel中配置数据库连接?

    在laravel中配置数据库连接需要以下步骤:1. 编辑.env文件,设置db_connection、db_host、db_port、db_database、db_username、db_password。2. 确保config/database.php文件正确引用.env文件中的配置。3. 利用环…

    2026年9月21日
    000
  • MAC怎么查询硬件序列号_Mac查找本机序列号与保修信息

    首先可通过“关于本机”查看Mac序列号,依次点击苹果菜单→“关于本机”即可获取;也可通过“系统信息”或“终端”命令ioreg -l | grep IOPlatformSerialNumber查找;若无法操作设备,可登录Apple ID账户在线查询;最后访问苹果官网保修查询页面输入序列号,即可验证保修…

    2026年9月21日
    200
  • Safari浏览器下载中断怎么办 Safari浏览器下载失败问题修复方法

    先检查下载状态和权限设置,确认网站未被限制下载;通过无痕模式测试排除缓存或插件干扰;清理部分下载文件并更换网络环境;最后更新系统以确保兼容性。 遇到 Safari 下载中断或失败,别急着重启电脑。先确认下载是否真的卡住,有时只是速度慢。点按浏览器右下角的“显示所有下载”按钮(箭头方框图标),查看列表…

    2026年9月21日
    300
  • Linux如何设置虚拟网卡并分配IP

    Linux如何设置虚拟网卡并分配IPLinux如何设置虚拟网卡并分配IPLinux如何设置虚拟网卡并分配IPLinux如何设置虚拟网卡并分配IP

    可通过创建虚拟网卡为同一物理网卡绑定多个IP,临时使用ip addr add加label方式,永久配置则需修改对应系统网络配置文件,CentOS修改ifcfg-eth0:0,Ubuntu在interfaces文件中添加iface eth0:0,最后重启网络服务并验证接口状态。 在Linux系统中,可…

    2026年9月21日 用户投稿
    000
  • mysql如何设置自动重连

    答案:通过连接配置、连接池和应用层逻辑实现MySQL自动重连。启用MYSQL_OPT_RECONNECT选项(旧版本),推荐使用连接池如PooledDB、HikariCP并配置ping机制,应用层捕获连接异常后重试,结合指数退避策略提升稳定性。 MySQL 客户端或应用程序在连接断开后无法自动恢复,…

    2026年9月21日
    100
  • 猎豹浏览器官方网址链接入口 猎豹浏览器平台直达访问官方主页

    猎豹浏览器官方网址是http://m.liebao.cn/?f=www,该网站提供极速浏览体验、个性化界面设置和实用功能整合,如双渲染引擎、安全防护、主题皮肤、广告过滤等。 猎豹浏览器官方网址链接入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器平台直达访问官方主页,感兴趣的网…

    2026年9月21日
    200
  • Laravel与Vue.js/React前端框架集成

    laravel可以与vue.js或react集成。1) 使用命令“php artisan preset vue”或“php artisan preset react”设置开发环境。2) 在laravel视图中引入编译后的javascript文件。3) 通过laravel的api路由和前端框架的htt…

    2026年9月21日
    100
  • mac怎么开启深色模式_Mac开启深色模式方法

    1、可通过系统设置、调度功能或控制中心在Mac上启用深色模式以减少视觉疲劳。2、进入系统设置→外观→选择深色即可切换界面颜色。3、在外观→调度中可设日落到日出或自定时段自动切换。4、通过控制中心的显示模块也可快速启用深色模式,界面即时响应。 如果您希望在Mac上更改显示外观以减少视觉疲劳或适应低光环…

    2026年9月21日
    200
  • Grok官方主页登录入口_Grok最新版官方网站地址

    Grok官方主页登录入口是grok.com,用户需通过X账号登录,该网站支持电脑和手机浏览器访问,界面简洁,可进行多轮对话,并与X平台深度关联,提供免费及高级订阅服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Grok官方主页登录入口…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信