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
Laravel Collection多级分组与字段求和的高效实践_创想鸟

Laravel Collection多级分组与字段求和的高效实践

laravel collection多级分组与字段求和的高效实践

本文深入探讨了在Laravel应用中,如何利用Collection的高级功能对复杂数据进行多级分组、合并重复项并对特定字段进行求和。通过实例演示,详细讲解了如何处理嵌套数据结构,实现数据聚合与重构,以满足业务报表和交付单等场景的数据展示需求。

在现代Web应用开发中,数据处理和转换是常见的任务。尤其是在处理来自数据库的JSON字段或复杂数组时,我们经常需要对数据进行分组、聚合和重构,以生成用户友好的报告或视图。Laravel的Collection类提供了一套强大且富有表现力的API,能够优雅地完成这些任务。

场景描述:多级分组与字段求和

假设我们有一个销售圣诞树的应用程序,其中用户的销售明细(line_items)以JSON格式存储在数据库中。这些明细可能包含树的类型(type)、尺寸(size)、数量(amount)以及其他辅助信息如槽位(slot)、托盘(pallet)和标签(label)。

在生成交付单时,我们面临一个挑战:同一批次中可能有多托盘相同类型和尺寸的树。我们需要将这些重复项合并,并将其数量进行累加,同时只保留类型、尺寸和总数量这几个核心字段,去除其他冗余信息。

原始数据结构示例(deliveryNote->line_items):

[  {    "slot": 2,    "pallet": "cghjh",    "type": "NGR",    "label": "purple",    "size": "125-150",    "amount": "30"  },  {    "slot": 3,    "pallet": "cghjh",    "type": "NGR",    "label": "purple",    "size": "125-150",    "amount": "30"  },  {    "slot": 2,    "pallet": "yghiuj",    "type": "NGR",    "label": "orange",    "size": "150-175",    "amount": "30"  },  {    "slot": 3,    "pallet": "cghjh",    "type": "NOB",    "label": "purple",    "size": "125-150",    "amount": "30"  }]

我们的目标是将其转换为以下结构:

{  "NGR": {    "125-150": [      {        "type": "NGR",        "size": "125-150",        "amount": "60"      }    ],    "150-175": [      {        "type": "NGR",        "size": "150-175",        "amount": "30"      }    ]  },  "NOB": {    "125-150": [      {        "type": "NOB",        "size": "125-150",        "amount": "30"      }    ]  }}

初始分组尝试与挑战

首先,我们可以使用groupBy方法按type和size进行分组:

$data = collect($deliveryNote->line_items)    ->groupBy(['type', 'size']);

这将产生一个嵌套的Collection结构,例如:

{  "NGR": {    "125-150": [      { /* item 1 */ },      { /* item 2 */ }    ],    "150-175": [      { /* item 3 */ }    ]  },  "NOB": {    "125-150": [      { /* item 4 */ }    ]  }}

此时,我们已经按照type和size成功分组。然而,如果直接尝试在最外层map中对amount求和,例如:

$data = collect($deliveryNote->line_items)    ->groupBy(['type', 'size'])    ->map(function ($item) {        // 这里的 $item 是一个包含多个尺寸分组的Collection,而不是单个尺寸分组的Collection        // 例如,对于 "NGR",$item 是 {"125-150": [...], "150-175": [...]}        // 直接 sum('amount') 将无法正确工作        return $item->sum('amount');    });

这种方法会导致错误的结果,因为$item在此上下文中代表的是一个包含多个size分组的Collection(例如,”NGR”下的所有尺寸分组),而不是单个尺寸分组内的原始数据项。为了正确求和,我们需要深入到更深一层的分组中。

解决方案:嵌套迭代与数据重构

要实现正确的求和与数据重构,我们需要对groupBy生成的嵌套Collection进行进一步的迭代。这可以通过链式调用map方法来完成,对每一层分组进行处理。

以下是实现目标功能的完整代码:

use IlluminateSupportCollection;// 假设 $deliveryNote->line_items 是一个包含原始数据的数组或Collection$lineItems = collect($deliveryNote->line_items);$processedData = $lineItems    ->groupBy(['type', 'size']) // 首先按 'type' 和 'size' 进行多级分组    ->map(function (Collection $sizesCollection, string $type) {        // $sizesCollection 是一个Collection,其键是 'size',值是该尺寸下的所有原始数据项的Collection        // 例如:{"125-150" => Collection([...]), "150-175" => Collection([...])}        return $sizesCollection->map(function (Collection $itemsInSizeGroup, string $size) use ($type) {            // $itemsInSizeGroup 是一个Collection,包含所有具有相同 'type' 和 'size' 的原始数据项            // 此时,我们可以对这些项的 'amount' 字段进行求和            return [                'type' => $type, // 使用外层map回调中的 $type                'size' => $size, // 使用当前map回调中的 $size                'amount' => (int) $itemsInSizeGroup->sum('amount'), // 对 'amount' 字段求和,确保类型为整数            ];        });    });// 如果需要将最终结果转换为纯数组格式(移除Collection对象),可以添加以下步骤:// $processedData = $processedData->toArray();// foreach ($processedData as $type => $sizes) {//     $processedData[$type] = array_values($sizes->toArray());// }

代码解析:

collect($deliveryNote->line_items): 将原始数据转换为一个Collection实例,以便使用Collection的丰富方法。->groupBy([‘type’, ‘size’]): 这是关键的第一步,它会根据提供的键(type和size)对Collection进行多级分组。结果是一个嵌套的Collection,外层键是type,内层键是size,最内层是匹配该type和size的所有原始数据项的Collection。->map(function (Collection $sizesCollection, string $type) { … }): 这一层map迭代的是groupBy结果的第一层,即按type分组的Collection。$sizesCollection:是当前type下所有size分组的Collection。$type:是当前的类型字符串(例如 “NGR”)。return $sizesCollection->map(function (Collection $itemsInSizeGroup, string $size) use ($type) { … }): 这一层map迭代的是sizesCollection,即按size分组的Collection。$itemsInSizeGroup:是当前type和size组合下所有原始数据项的Collection。这是我们最终需要聚合的Collection。$size:是当前的尺寸字符串(例如 “125-150″)。use ($type):通过use关键字将外层$type变量引入到内层闭包中,以便在结果数组中使用。return [ ‘type’ => $type, ‘size’ => $size, ‘amount’ => (int) $itemsInSizeGroup->sum(‘amount’), ]: 在最内层的map中,我们对$itemsInSizeGroup中的所有项的amount字段进行求和。$itemsInSizeGroup->sum(‘amount’):计算当前分组内所有项的amount总和。(int):将求和结果强制转换为整数类型,以防原始数据中的amount是字符串导致求和结果不准确或后续处理问题。我们构建了一个新的数组,只包含type、size和amount这三个所需字段,从而实现了数据的重构和简化。

注意事项

数据类型转换: 在对amount字段进行求和之前,务必确保其数据类型是数值型。如果原始数据中的amount是字符串(如示例所示),sum()方法会自动尝试转换,但显式地进行类型转换(如(int)或(float))可以增加代码的健壮性。Collection的不可变性: Laravel Collection的大多数方法都会返回一个新的Collection实例,而不是修改原有的Collection。这使得链式操作更加安全和可预测。性能考量: 对于非常庞大的数据集,连续的groupBy和map操作可能会带来一定的性能开销。如果数据量巨大且操作频繁,可以考虑在数据库层面进行聚合(例如使用SQL的GROUP BY和SUM),然后将结果取出。键的保留: 在本例中,groupBy会保留原始的type和size作为Collection的键。如果最终输出不需要这些作为键,而只需要一个扁平的数组结构,可能需要额外的values()或flatten()操作。本教程的输出格式要求是保留type和size作为键,因此当前的解决方案是合适的。

总结

通过巧妙地结合使用Laravel Collection的groupBy和map方法,我们可以高效地处理复杂的数据结构,实现多级分组、数据聚合以及按需重构。这种方法不仅代码简洁,而且表达力强,极大地提高了数据处理的效率和可维护性。掌握这些Collection操作技巧,将使您在Laravel开发中能够更灵活地应对各种数据转换挑战。

以上就是Laravel Collection多级分组与字段求和的高效实践的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Laravel Collection分组、合并与字段求和:构建清晰的数据视图
上一篇 2025年12月12日 06:41:39
探索Laravel Collection:高效查找两个集合的共同元素
下一篇 2025年12月12日 06:41:49

相关推荐

  • laravel路由里的scope是什么

    laravel路由里的scope是什么laravel路由里的scope是什么laravel路由里的scope是什么laravel路由里的scope是什么

    laravel路由里的scope是什么? laravel中的scope作用域 laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理 也就是在模板定义方法中,加上前缀scope。 简言之,Laravel中模型中可以定义scope开头方法,这类方法可以通过模型直接调用。这…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么配置swift开发环境_sublime Swift开发环境配置教程

    sublime怎么配置swift开发环境_sublime Swift开发环境配置教程sublime怎么配置swift开发环境_sublime Swift开发环境配置教程sublime怎么配置swift开发环境_sublime Swift开发环境配置教程sublime怎么配置swift开发环境_sublime Swift开发环境配置教程

    安装Sublime Text 4并配置Package Control;2. 通过Package Control安装Swift语法插件;3. 创建自定义Build System运行Swift代码;4. 可选安装SwiftFormat实现代码格式化;5. 注意缺乏调试与完整类型提示,适用于学习和小项目。…

    2026年9月26日 • 用户投稿
    000
  • sublime侧边栏太宽怎么调_sublime侧边栏宽度调整教程

    sublime侧边栏太宽怎么调_sublime侧边栏宽度调整教程sublime侧边栏太宽怎么调_sublime侧边栏宽度调整教程sublime侧边栏太宽怎么调_sublime侧边栏宽度调整教程sublime侧边栏太宽怎么调_sublime侧边栏宽度调整教程

    答案:通过修改主题配置文件可调整Sublime Text侧边栏宽度。打开Default.sublime-theme文件,找到”sidebar_container”的content_margin设置,将左右边距数值调小(如[8, 16]),保存后立即生效,能扩大代码编辑区域;使…

    2026年9月26日 • 用户投稿
    000
  • Minecraft Forge 1.12.2 自定义玩家模型替换教程

    Minecraft Forge 1.12.2 自定义玩家模型替换教程Minecraft Forge 1.12.2 自定义玩家模型替换教程Minecraft Forge 1.12.2 自定义玩家模型替换教程Minecraft Forge 1.12.2 自定义玩家模型替换教程

    本教程旨在解决Minecraft Forge 1.12.2中替换玩家默认模型为BlockBench自定义模型的技术挑战。文章首先分析了手动渲染替换中常见的NullPointerException问题,指出其根本原因及手动实现复杂性。随后,重点推荐并概述了GeckoLib这一强大的动画模型库,作为简化…

    2026年9月26日 • 用户投稿
    200
  • sublime有哪些必装的插件_sublime推荐必装插件清单

    sublime有哪些必装的插件_sublime推荐必装插件清单sublime有哪些必装的插件_sublime推荐必装插件清单sublime有哪些必装的插件_sublime推荐必装插件清单sublime有哪些必装的插件_sublime推荐必装插件清单

    Sublime Text通过插件可大幅提升效率,建议安装Package Control以方便管理插件;SideBarEnhancements增强侧边栏功能,支持文件快速操作;Emmet和代码片段插件提升前端开发速度,实现HTML/CSS/JS的高效编写;Git集成插件支持版本控制操作,GitGutt…

    2026年9月26日 • 用户投稿
    200
  • Java加密输出长度优化:应对API 100字符限制的策略与实践

    Java加密输出长度优化:应对API 100字符限制的策略与实践Java加密输出长度优化:应对API 100字符限制的策略与实践Java加密输出长度优化:应对API 100字符限制的策略与实践Java加密输出长度优化:应对API 100字符限制的策略与实践

    本文探讨在Java中实现文本加密时,如何应对输出密文长度不超过100字符的严格限制。我们将深入理解加密算法的本质,分析其非压缩特性及额外开销,并提供一系列实用的优化策略,包括前置数据压缩、最小化加密开销、高效密文表示以及协议层面的分段传输,旨在帮助开发者在满足安全需求的同时,符合特定的API长度约束…

    2026年9月26日 • 用户投稿
    100
  • Android应用中Activity间文件路径传递与PDF加载指南

    Android应用中Activity间文件路径传递与PDF加载指南Android应用中Activity间文件路径传递与PDF加载指南Android应用中Activity间文件路径传递与PDF加载指南Android应用中Activity间文件路径传递与PDF加载指南

    本文旨在解决Android应用中通过Intent在Activity间传递文件路径时常见的NullPointerException问题,尤其是在加载PDF文件场景。我们将深入分析导致此错误的原因,并提供两种安全有效的解决方案:使用getAbsolutePath()传递字符串路径,或利用Serializ…

    2026年9月26日 • 用户投稿
    1400
  • x浏览器怎么看视频的时候小窗播放_x浏览器视频画中画模式使用教程

    x浏览器怎么看视频的时候小窗播放_x浏览器视频画中画模式使用教程x浏览器怎么看视频的时候小窗播放_x浏览器视频画中画模式使用教程x浏览器怎么看视频的时候小窗播放_x浏览器视频画中画模式使用教程x浏览器怎么看视频的时候小窗播放_x浏览器视频画中画模式使用教程

    首先启用X浏览器内置画中画功能,播放视频后退出全屏并点击“小窗”图标即可悬浮播放;若不支持,可前往系统设置开启Safari的画中画选项,返回X浏览器播放时按主屏键触发系统级小窗;还可通过App Store下载浮屏播放器类第三方工具,安装后授权辅助功能,侧滑调出控制器提取视频流实现浮窗播放。 如果您在…

    2026年9月26日 • 用户投稿
    000
  • 使用 Git 实现 Laravel 项目的自动化部署

    使用 Git 实现 Laravel 项目的自动化部署使用 Git 实现 Laravel 项目的自动化部署使用 Git 实现 Laravel 项目的自动化部署使用 Git 实现 Laravel 项目的自动化部署

    简介 在我们的开发过程中,我们不可避免的会用到版本控制。当然,这也致使你对 Git 和 SVN 有所了解。两者都是出色的版本控制工具,我个人比较习惯用 Git,当然这可能和个人习惯有关。不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登…

    2026年9月26日 • 用户投稿
    900
  • Laravel中利用Scout集成Elasticsearch搜索引擎

    写在前面 Elasticsearch(以下简称es)是一个实时的分布式搜索和分析引擎。 在搜索引擎方面,不仅仅有Elasticsearch,像另一篇提到的Algolia,还有sphinx、Solr等等,这里不做评价和比较,本篇主要介绍laravel中如何使用Elasticsearch。 首选必须安装…

    2026年9月26日
    000
  • laravel和其他框架的区别

    laravel和其他框架的区别laravel和其他框架的区别laravel和其他框架的区别laravel和其他框架的区别

    今天就为大家分享一篇laravel框架与其他框架的详细对比,具有很好的参考价值,希望对大家有所帮助。 优点:     (推荐学习:laravel开发) 1、代码比较明白易懂,跟英语句子差不多,关键词就是函数,举个例子,获取数据库中某个表的所有数据: $article=new Article;$art…

    2026年9月25日 • 用户投稿
    000
  • laravel的passport和jwt的区别

    laravel的passport和jwt的区别laravel的passport和jwt的区别laravel的passport和jwt的区别laravel的passport和jwt的区别

    简介 Passport是一个Node.js中间件,它提供了易于实现的各种不同的请求身份验证策略。默认情况下,它将用户对象存储在会话中。    (推荐学习:laravel开发) JSON Web令牌是一种身份验证标准,通过在有助于识别登录用户的请求中分配和传递加密令牌,而不是将用户存储在服务器上的会话…

    2026年9月25日 • 用户投稿
    200
  • sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法

    sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法

    安装LiveSassCompiler插件并配置路径后,保存SCSS文件可自动编译为CSS。1. 通过Package Control安装插件;2. 设置输入输出路径;3. 保存文件触发编译,提升开发效率。 Sublime Text 要实现 SASS/SCSS 的自动编译,可以通过安装插件并配置构建系统…

    2026年9月25日 • 用户投稿
    400
  • laravel和tp5的区别

    laravel和tp5的区别laravel和tp5的区别laravel和tp5的区别laravel和tp5的区别

    Laravel框架:     (推荐学习:laravel开发) Lavavel一直秉承着优雅的原则,很好的支持了composer,实现了更丰富的扩展,社区文档活跃,相较于TP,Lavavel更庞大,安全性也更高,更适合开发大中型项目,被称为“巨匠型开发框架”。 在Laravel中已经具有了一套高级的…

    2026年9月25日 • 用户投稿
    000
  • laravel和thinkphp路由区别

    laravel和thinkphp路由区别laravel和thinkphp路由区别laravel和thinkphp路由区别laravel和thinkphp路由区别

    laravel路由有如下这些功能: 基本路由路由重定向 视图路由路由参数必填参数 可选参数 正则表达式约束命名路由路由组中间件 命名空间 子域名路由 路由前缀 路由命名前缀路由模型绑定隐式绑定 显式绑定频率限制表单方法伪造访问当前路由  (推荐学习:laravel开发) 所有 Laravel 路由都…

    2026年9月25日 • 用户投稿
    000
  • sublime怎么运行php文件 _sublime PHP文件运行方法

    sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法

    首先确保PHP已安装并加入环境变量,然后在Sublime Text中创建PHP构建系统:通过Tools → Build System → New Build System…添加对应操作系统的JSON配置,保存为PHP.sublime-build至User目录;接着打开.php文件按Ctrl+ B或C…

    2026年9月25日 • 用户投稿
    100
  • 开源鸿蒙 6.0 Release 版本发布

    开源鸿蒙 6.0 Release 版本发布开源鸿蒙 6.0 Release 版本发布开源鸿蒙 6.0 Release 版本发布开源鸿蒙 6.0 Release 版本发布

    开源鸿蒙 6.0 release 版本已正式上线。据悉,该版本在应用框架、媒体处理、系统安全等多个核心技术领域实现了重要突破,显著增强了系统的稳定性和开发效率,同时进一步优化了生态适配能力。 在应用开发方面,ArkUI组件能力得到深度增强,新增了组件背景安全区自动延伸功能。当界面元素靠近状态栏或导航…

    2026年9月25日 • 用户投稿
    000
  • Java 中处理货币数据的最佳实践

    Java 中处理货币数据的最佳实践Java 中处理货币数据的最佳实践Java 中处理货币数据的最佳实践Java 中处理货币数据的最佳实践

    本文旨在探讨在 Java 中处理货币数据的最佳实践。面对 JSON 数据中包含的货币值(例如 “$234,205,860″),直接使用 String 存储是一种选择,但可能并非最优。本文将深入分析各种数据类型在处理货币时的优劣,并推荐使用 BigDecimal 进行精确计算,…

    2026年9月25日 • 用户投稿
    100
  • Laravel 邮件推送系统异常

    Laravel 邮件推送系统异常Laravel 邮件推送系统异常Laravel 邮件推送系统异常Laravel 邮件推送系统异常

    前言: 在日常开发中,我们可能会写出一些 bug,但是项目已经上线了,我们无法第一时间得到客户的反馈,这时候邮件报错系统就派上用场了,我们都知道 laravel 的异常处理都需要通过 Handler.php 文件来处理,那么就从此处开始入手 1、在 report 的方法里判断是否需要发送邮件,代码如…

    2026年9月25日 • 用户投稿
    000
  • Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    本教程详细介绍了如何在Groovy中通过HTTP请求头发送授权令牌,以实现对RESTful API的安全访问。针对用户在Groovy中模拟curl -H ‘Authorization: token …’命令时遇到的常见问题,本文提供了基于java.net.URL和…

    2026年9月25日 • 用户投稿
    900

发表回复

登录后才能评论
关注微信