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 中对包含月份缩写的多维数组进行排序。核心方法是利用自定义比较函数 `uasort`,结合预定义的月份优先级映射表,确保数组中的数据项能按照正确的月份顺序(如 jan, feb, mar…)进行排列,并处理了通过引用传递数组以实现原地排序的关键细节。

PHP 多维数组按月份缩写排序

在处理包含时间或日期数据的多维数组时,经常需要根据月份的自然顺序对其进行排序。本教程将指导您如何使用 PHP 实现这一功能,特别是在月份以三字母缩写(如 “Jan”, “Feb”)形式存在的情况下。

问题场景

假设我们有一个复杂的多维数组,其结构如下所示。每个顶层元素包含一个 name 字段和一个 data 数组。data 数组中的每个子元素又包含 x(月份缩写)和 y(对应值)。我们的目标是对每个顶层元素内部的 data 数组,按照 x 字段所代表的月份顺序进行排序。

$shipping_chart_month = [    [        "name" => "8:00 AM",        "data" => [            ["x" => "May", "y" => 37],            ["x" => "Nov", "y" => 32],            ["x" => "Apr", "y" => 1],            ["x" => "Aug", "y" => 45],            ["x" => "Sep", "y" => 19],            ["x" => "Jul", "y" => 13],            ["x" => "Oct", "y" => 43],            ["x" => "Jun", "y" => 31],            ["x" => "Feb", "y" => 0],            ["x" => "Jan", "y" => 0],            ["x" => "Mar", "y" => 0]        ]    ],    [        "name" => "9:00 AM",        "data" => [            ["x" => "Apr", "y" => 26],            ["x" => "Oct", "y" => 84],            ["x" => "Sep", "y" => 35],            ["x" => "Jul", "y" => 26],            ["x" => "Feb", "y" => 6],            ["x" => "Nov", "y" => 96],            ["x" => "Mar", "y" => 10],            ["x" => "May", "y" => 50],            ["x" => "Aug", "y" => 66],            ["x" => "Jun", "y" => 36],            ["x" => "Jan", "y" => 0]        ]    ]];

核心思路

要实现按月份缩写排序,我们不能直接进行字符串比较,因为“Apr”在字母顺序上可能排在“Aug”之前,但在月份顺序上却相反。因此,我们需要一个映射机制,将每个月份缩写转换为一个可比较的数值(即其在一年中的顺序)。

创建月份优先级映射表: 将每个三字母月份缩写映射到一个数字优先级(例如,’Jan’ => 1, ‘Feb’ => 2, …)。遍历主数组: 使用 foreach 循环遍历主数组的每个顶层元素。引用传递: 在遍历过程中,为了能够直接修改原数组,需要通过引用传递 (&$array) 来访问每个顶层元素。自定义排序函数: 对每个顶层元素内部的 data 数组使用 uasort 函数。uasort 允许我们定义一个自定义的比较函数,并且会保留数组原有的键名关联。比较逻辑: 在自定义比较函数中,获取待比较的两个元素的月份缩写,通过映射表获取它们的优先级,然后根据优先级进行数值比较。

详细实现步骤

首先,定义月份缩写到数字优先级的映射表:

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

$monthAliasMap = [    'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4,    'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8,    'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12,];

接下来,遍历主数组并应用排序逻辑:

foreach ($shipping_chart_month as &$array) { // 使用引用传递,直接修改原数组    uasort($array['data'], function ($a, $b) use ($monthAliasMap) {        // 获取当前元素的月份缩写        $aMonthAlias = $a['x'];        $bMonthAlias = $b['x'];        // 从映射表中获取月份的优先级        $aPriority = (int)$monthAliasMap[$aMonthAlias];        $bPriority = (int)$monthAliasMap[$bMonthAlias];        // 进行比较        if ($aPriority === $bPriority) {            return 0; // 优先级相同,保持原有顺序        }        return ($aPriority < $bPriority) ? -1 : 1; // 优先级低的排在前面    });}unset($array); // 释放引用,避免意外修改

完整示例代码

 "8:00 AM",        "data" => [            ["x" => "May", "y" => 37],            ["x" => "Nov", "y" => 32],            ["x" => "Apr", "y" => 1],            ["x" => "Aug", "y" => 45],            ["x" => "Sep", "y" => 19],            ["x" => "Jul", "y" => 13],            ["x" => "Oct", "y" => 43],            ["x" => "Jun", "y" => 31],            ["x" => "Feb", "y" => 0],            ["x" => "Jan", "y" => 0],            ["x" => "Mar", "y" => 0]        ]    ],    [        "name" => "9:00 AM",        "data" => [            ["x" => "Apr", "y" => 26],            ["x" => "Oct", "y" => 84],            ["x" => "Sep", "y" => 35],            ["x" => "Jul", "y" => 26],            ["x" => "Feb", "y" => 6],            ["x" => "Nov", "y" => 96],            ["x" => "Mar", "y" => 10],            ["x" => "May", "y" => 50],            ["x" => "Aug", "y" => 66],            ["x" => "Jun", "y" => 36],            ["x" => "Jan", "y" => 0]        ]    ]];// 月份别名到排序优先级的映射表$monthAliasMap = [    'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4,    'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8,    'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12,];// 遍历主数组,并对每个子数组进行排序foreach ($shipping_chart_month as &$array) {    uasort($array['data'], function ($a, $b) use ($monthAliasMap) {        // 获取待比较元素的月份缩写        $aMonthAlias = $a['x'];        $bMonthAlias = $b['x'];        // 从映射表中获取对应的优先级数值        $aPriority = (int)$monthAliasMap[$aMonthAlias];        $bPriority = (int)$monthAliasMap[$bMonthAlias];        // 根据优先级进行比较        if ($aPriority === $bPriority) {            return 0; // 优先级相同,视为相等        }        // 如果 $a 的优先级小于 $b,则 $a 应该排在 $b 之前        return ($aPriority < $bPriority) ? -1 : 1;    });}unset($array); // 释放对最后一个元素的引用// 打印排序后的结果(部分输出)echo "
";print_r($shipping_chart_month);echo "

";/*预期输出结构(部分):[ 0 => [ 'name' => '8:00 AM', 'data' => [ // ... 原始键名可能不同,但顺序已改变 9 => [ 'x' => 'Jan', 'y' => 0, ], 8 => [ 'x' => 'Feb', 'y' => 0, ], 10 => [ 'x' => 'Mar', 'y' => 0, ], 2 => [ 'x' => 'Apr', 'y' => 1, ], 0 => [ 'x' => 'May', 'y' => 37, ], 7 => [ 'x' => 'Jun', 'y' => 31, ], 5 => [ 'x' => 'Jul', 'y' => 13, ], 3 => [ 'x' => 'Aug', 'y' => 45, ], 4 => [ 'x' => 'Sep', 'y' => 19, ], 6 => [ 'x' => 'Oct', 'y' => 43, ], 1 => [ 'x' => 'Nov', 'y' => 32, ], // ... Dec (如果存在) ], ], // ... 其他顶层元素]*/?>

注意事项与总结

引用传递 (&$array): 这是实现原地修改原数组的关键。如果省略 &,foreach 循环会操作数组的副本,导致原数组未被修改。循环结束后,务必使用 unset($array) 来释放引用,避免后续代码中意外地修改到 $shipping_chart_month 数组的最后一个元素。uasort 与 usort:uasort:根据用户自定义的比较函数对数组进行排序,并保持索引关联。这意味着排序后,原始键名会与它们的值一起移动。usort:根据用户自定义的比较函数对数组进行排序,但会重新索引数组(数字索引会从 0 开始重新分配)。根据本教程的场景,由于 data 数组中的元素本身没有特殊的数字索引依赖,uasort 或 usort 都可以工作,但 uasort 更能体现“保持键值关联”的特性,如果原始键名对后续处理很重要,则应优先选择 uasort。月份映射表的完整性: 确保 monthAliasMap 包含了所有可能出现的月份缩写。如果遇到未在映射表中的月份,将会导致错误。可扩展性: 如果需要支持其他日期格式(如完整月份名称),可以扩展 monthAliasMap 或在比较函数中增加逻辑来解析这些格式。

通过上述方法,您可以高效且准确地对包含月份缩写的多维数组进行排序,确保数据按照自然的月份顺序呈现,从而提高数据分析和展示的准确性。

以上就是PHP 多维数组按月份缩写进行排序的教程的详细内容,更多请关注php中文网其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Web 应用中实时用户状态管理:会话终止与浏览器关闭场景下的数据库操作策略
上一篇 2025年12月12日 10:36:20
使用 Ajax 进行文件上传时解决 $_POST 和 $_FILES 为空的问题
下一篇 2025年12月12日 10:36:33

相关推荐

  • Vue.js 项目中实现练习进度保存的策略与实践

    本文将探讨在vue.js项目中实现用户练习进度保存的最佳实践。针对需要跨会话保留用户进度的场景,我们将重点介绍如何利用浏览器localstorage进行数据持久化,包括数据的序列化与反序列化、在关键生命周期钩子中加载与保存数据,以及相关的注意事项,确保用户能够从上次中断的地方继续练习。 在开发基于V…

    2026年9月23日
    100
  • 苹果官网真品认证通道 iPhone序列号查验正品入口

    苹果官网真品认证通道为https://checkcoverage.apple.com/cn/zh/,用户可通过输入iPhone序列号查验设备激活状态、保修期限及技术支持覆盖情况,确保正品并降低二手交易风险。 苹果官网真品认证通道 iPhone序列号查验正品入口在哪里?这是不少网友都关注的,接下来由P…

    2026年9月23日
    200
  • PHP面向对象高级特性_PHP高级OOP设计模式

    PHP高级OOP特性如命名空间、Traits、魔术方法等结合设计模式可提升代码质量。1. 命名空间避免类冲突,Traits实现横向复用,后期静态绑定支持运行时解析,魔术方法增强对象控制,抽象类与接口定义契约,Final防止继承修改。2. 单例确保唯一实例,工厂封装创建逻辑,依赖注入降低耦合,观察者实…

    2026年9月23日
    100
  • AO3镜像站替代访问链接_AO3镜像站官方镜像站点

    AO3镜像站替代访问链接为https://nightalk.xyz,用户可通过主站或镜像站点登录账户,支持中文界面切换与多端同步阅读。 AO3镜像站替代访问链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站官方镜像站点,感兴趣的网友一起随小编来瞧瞧吧! https://arc…

    2026年9月23日
    100
  • PHP高效读取大型GZ文件:揭示Gzip的顺序访问限制与实践方法

    本教程深入探讨了php中处理大型gz压缩文件的核心挑战:其固有的顺序访问特性。我们将解释为何无法对gz文件进行随机跳转读取,以及这意味着您必须从头开始按序解压数据。文章将提供一种实用的分块读取策略,并附带php示例代码,帮助开发者高效、安全地处理超大gz文件,同时讨论潜在的跨块数据处理问题及内存管理…

    2026年9月23日
    200
  • 深入理解 PHP PDO:正确获取最后插入ID的连接管理策略

    本文旨在解决 PHP PDO 中 lastInsertId() 方法返回 0 的常见问题。核心原因在于每次数据库操作时重复创建新的 PDO 连接,导致 lastInsertId() 无法在正确的会话中获取到自动递增ID。解决方案是优化数据库连接类,通过实现连接的单例模式,确保在整个请求生命周期内复用…

    2026年9月23日
    200
  • PHP命令怎么获取执行结果_PHP命令执行结果捕获与返回值处理技巧

    使用exec()可捕获命令输出和返回状态,shell_exec()仅获取输出,proc_open()支持精细控制;需用escapeshellarg()等函数确保安全,并优先使用内置函数替代系统命令。 在PHP中执行系统命令并获取其输出结果和返回状态,是很多运维脚本、自动化工具或与外部程序交互场景下的…

    2026年9月22日
    300
  • 解决TCPDF保存文件权限问题的完整指南

    本文旨在解决使用tcpdf在%ignore_a_1%中生成pdf并保存到服务器(’f’模式)时遇到的“permission denied”错误,尤其是在macos环境下。核心问题通常源于不正确的服务器文件路径或目标文件夹缺乏写入权限。教程将详细阐述如何构建正确的绝对文件路径,…

    2026年9月22日
    200
  • PHPRestfulAPI怎么开发_PHP构建高效安全的RestfulAPI教程

    答案:本文介绍如何用PHP构建高效安全的Restful API,涵盖设计规范、项目结构、数据库操作、安全机制、统一响应格式及性能优化。遵循Restful风格使用标准HTTP方法与状态码,通过index.php统一入口路由请求至控制器;采用PDO预处理防止SQL注入,结合JWT实现认证授权,确保输入验…

    2026年9月22日
    100
  • 苹果官网真伪验证平台 iPhone序列号确认正版入口

    苹果官网真伪验证平台入口为 https://checkcoverage.apple.com/cn/zh/,用户可在此输入iPhone序列号验证正版,通过查看设备状态、型号、销售地、保修期等信息确认设备真实性,并检查激活锁与配置锁状态以确保设备安全可用。 苹果官网真伪验证平台 iPhone序列号确认正…

    2026年9月22日
    100
  • MAC的“自动操作”(Automator)怎么用_macOS自动操作创建快速工作流程

    使用Automator可创建自动化工作流程,通过选择“工作流程”并添加操作实现任务串联,保存为“快速操作”或“应用程序”便于调用,结合日历设置定时执行,并可嵌入Shell脚本扩展功能,提升Mac操作效率。 如果您希望在日常操作中提升效率,可以通过自动化重复性任务来节省时间。MAC的“自动操作”(Au…

    2026年9月22日
    000
  • Java TreeMap如何自定义排序规则

    TreeMap默认按键的自然顺序排序,可通过构造函数传入Comparator自定义排序规则。例如字符串可按长度排序:TreeMap map = new TreeMap((s1, s2) -> s1.length() – s2.length()); 对自定义对象如Person可按年龄…

    2026年9月22日
    100
  • 1688客户端怎么发布寻源信息_1688客户端发布寻源信息的详细教程

    1、打开1688客户端,进入“找货源”或“寻源”专区,点击“发布寻源需求”;2、填写商品名称、数量、价格区间、收货地等信息,上传参考图片和备注特殊要求;3、设置寻源有效期并提交,系统将自动匹配供应商;4、可在“我的寻源”中查看报价,手动邀请商家或在线沟通,对比后通过订单系统完成采购。 1688客户端…

    2026年9月22日
    400
  • PHP递增操作符在条件语句中的应用_PHP条件判断与递增结合实践

    前置递增(++$i)先加1后返回新值,后置递增($i++)先返回原值再加1,影响条件判断结果;如$i=5时if($i++>5)不成立,因判断用的是5,之后$i变为6;循环中常见$count++控制次数,但复杂表达式如$a++&&$b++虽合法却降低可读性,应拆分以提升维护性;实…

    2026年9月22日
    200
  • 苹果官方正版认证入口 iPhone序列号查验正品通道

    苹果官方正版认证入口在https://support.apple.com/zh-cn/HT204073,用户可通过输入iPhone序列号查验设备激活日期、保修状态、是否为官换机或官修机、是否存在激活锁等信息,同时可识别BS资源机、展厅机、租赁机等特殊来源设备,并确认原始销售地区及功能锁定情况,确保购…

    2026年9月22日
    200
  • PHP三元运算符复杂条件_PHP三元运算符多条件处理

    三元运算符可通过逻辑运算符或嵌套实现多条件判断,如链式写法 $result = ($a > 5 && $b == 90) ? ‘优秀’ : $score >= 80 ? ‘良好’ : $score >= 60 ? &#…

    2026年9月22日
    100
  • laravel如何安全地在Blade中输出用户内容_Laravel Blade安全输出用户内容方法

    使用{{}}自动转义防止XSS,输出HTML时需用Purifier过滤并配合{!! !!},关键在于服务端预处理和始终不信任用户输入。 在 Laravel 的 Blade 模板中输出用户内容时,防止 XSS(跨站脚本攻击)是关键。Laravel 默认对 Blade 中的双大括号 {{ }} 语法进行…

    2026年9月22日
    100
  • 喵趣漫画官网登录页面 喵趣漫画免费阅读全本漫画

    喵趣漫画官网登录页面位于其官方网站https://www.miaoqumanhua.com/,用户可直接通过浏览器访问并登录账号。 喵趣漫画官网登录页面在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来喵趣漫画免费阅读全本漫画的相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://ww…

    2026年9月22日
    100
  • QQ阅读最新版本_QQ阅读官网下载链接

    QQ阅读最新版本官网下载链接是http://book.qq.com/,该平台提供海量正版小说资源,支持多格式电子书阅读,设有免费专区,并具备个性化设置、跨设备同步及互动社区等功能。 QQ阅读最新版本官网下载链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来QQ阅读最新版本的相关信息,感兴…

    2026年9月22日
    200
  • PHP匿名函数怎么用_PHP匿名函数使用场景分析

    PHP匿名函数是无名函数,可作为回调或赋值给变量,常用在数组处理、事件回调、逻辑封装等场景,支持use引入外部变量及fn短语法,结合bindTo可访问对象私有成员。 PHP匿名函数,也叫闭包函数(Closure),是一种没有名称的函数,通常作为回调使用或赋值给变量。它在实际开发中非常灵活,尤其适合用…

    2026年9月22日
    200

发表回复

登录后才能评论
关注微信