PHP多维数组按子数组出现次数排序教程

php多维数组按子数组出现次数排序教程

本教程旨在详细讲解如何在PHP中对多维数组进行自定义排序,使其根据子数组中特定元素的出现频率进行排列。我们将通过结合使用`array_column`、`array_count_values`和`usort`函数,实现将出现次数最多的子数组优先排列的复杂排序逻辑,并提供兼容PHP 7.0及以上版本的代码示例,确保开发者能够高效处理此类数据排序需求。

引言

在PHP开发中,我们经常需要处理复杂的数据结构,例如多维数组。当面临需要根据子数组的某个特定值(例如一个ID)的出现频率来对整个多维数组进行排序时,常规的排序函数往往力不从心。本文将介绍一种强大的组合方法,利用PHP内置函数实现这一高级排序需求,确保出现频率高的子数组能优先显示。

核心概念:统计子数组元素的出现频率

要实现按出现次数排序,首先需要确定每个子数组中用于标识其唯一性的元素(例如一个ID)在整个数组中出现的频率。这个过程可以通过以下两个关键函数协同完成:

array_column(): 此函数用于从多维数组中提取某一列的值。在本例中,我们将用它来提取每个子数组的第一个元素(作为标识ID)。array_count_values(): 此函数用于统计数组中所有值的出现次数,并返回一个关联数组,其中键是原数组中的值,值是该值出现的次数。

示例代码:统计频率

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

假设我们有以下多维数组 $items:

$items = array (    array ("00008", "Metal", "Melvins", "Working With God", "Sub Pop", "SP 009"),     array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02"),     array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02"),     array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02"),     array ("00021", "Techno", "Laurent Garnier", "Water Planet", "F Communications", "SDB00015"),     array ("00056", "LP", "Communards", "Communards", "RCA", "E 342-F"),     array ("00056", "LP", "Communards", "Communards", "RCA", "E 342-F"));// 提取所有子数组的第一个元素(ID)$ids = array_column($items, 0); // 结果:["00008", "00019", "00019", "00019", "00021", "00056", "00056"]// 统计每个ID的出现次数$counts = array_count_values($ids);/*结果:Array(    [00008] => 1    [00019] => 3    [00021] => 1    [00056] => 2)*/// (可选)按出现次数降序排列计数结果,便于理解,但非必需arsort($counts);/*结果:Array(    [00019] => 3    [00056] => 2    [00008] => 1    [00021] => 1)*/

现在,我们有了一个 $counts 数组,它清晰地记录了每个ID的出现频率。

使用 usort() 实现自定义排序

有了每个ID的出现频率后,我们就可以使用 usort() 函数对原始的多维数组 $items 进行自定义排序。usort() 接受两个参数:要排序的数组和一个用户自定义的比较函数。

比较函数会接收两个待比较的元素(在本例中是两个子数组 $a 和 $b),并根据它们的相对顺序返回一个整数:

如果 $a 应该排在 $b 之前,返回负数。如果 $a 和 $b 的顺序无关紧要(相等),返回 0。如果 $a 应该排在 $b 之后,返回正数。

为了实现按出现次数降序排序,我们的比较函数将:

获取 $a 和 $b 的第一个元素(ID)。在 $counts 数组中查找这两个ID对应的出现次数。使用PHP 7引入的飞船操作符 () 进行比较。为了实现降序排序(出现次数多的在前),我们将 $b 的计数与 $a 的计数进行比较:$counts[$b[0]] $counts[$a[0]]。

示例代码:自定义排序

// 假设 $items 和 $counts 已经如上所示准备好usort(    $items,    static fn($a, $b) => $counts[$b[0]]  $counts[$a[0]]);/*排序后的 $items 数组:Array(    [0] => Array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02")    [1] => Array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02")    [2] => Array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02")    [3] => Array ("00056", "LP", "Communards", "Communards", "RCA", "E 342-F")    [4] => Array ("00056", "LP", "Communards", "Communards", "RCA", "E 342-F")    [5] => Array ("00008", "Metal", "Melvins", "Working With God", "Sub Pop", "SP 009")    [6] => Array ("00021", "Techno", "Laurent Garnier", "Water Planet", "F Communications", "SDB00015"))*/

完整示例代码

将上述步骤整合,即可实现完整的排序逻辑:

<?php$items = array (    array ("00008", "Metal", "Melvins", "Working With God", "Sub Pop", "SP 009"),     array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02"),     array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02"),     array ("00019", "LP", "Ray Parker", "The Other Woman", "EMI", "EMI02"),     array ("00021", "Techno", "Laurent Garnier", "Water Planet", "F Communications", "SDB00015"),     array ("00056", "LP", "Communards", "Communards", "RCA", "E 342-F"),     array ("00056", "LP", "Communards", "Communards", "RCA", "E 342-F"));echo "原始数组:n";print_r($items);// 步骤1: 提取子数组的第一个元素(作为唯一标识)$ids = array_column($items, 0);// 步骤2: 统计每个唯一标识的出现次数$counts = array_count_values($ids);// 步骤3: 使用 usort 和自定义比较函数对原始数组进行排序// 比较函数将根据 $counts 数组中的频率进行比较// $counts[$b[0]]  $counts[$a[0]] 确保出现次数多的元素排在前面usort(    $items,    static fn($a, $b) => $counts[$b[0]]  $counts[$a[0]]);echo "n按出现次数排序后的数组:n";print_r($items);?>

PHP 版本兼容性

上述 static fn($a, $b) => … 语法是 PHP 7.4 引入的箭头函数 (Arrow Functions)。如果您的项目运行在 PHP 7.0 到 PHP 7.3 版本,需要使用传统的匿名函数语法:

// PHP 7.0 到 PHP 7.3 兼容的 usort 调用usort(    $items,    static function ($a, $b) use ($counts) {        return $counts[$b[0]]  $counts[$a[0]];    });

请注意,匿名函数需要通过 use ($counts) 关键字将外部变量 $counts 引入其作用域

注意事项与扩展

排序依据的定义:本教程的方法是基于子数组的第一个元素(索引 0)进行计数和排序。如果需要基于子数组中其他索引的元素,只需调整 array_column($items, 0) 中的索引值。如果需要基于整个子数组的完全匹配来计数,则需要先将子数组序列化(例如使用 serialize() 或 json_encode()),再进行 array_count_values()。

// 示例:按整个子数组的完全匹配计数$serializedItems = array_map('serialize', $items);$fullCounts = array_count_values($serializedItems);usort(    $items,    static fn($a, $b) => $fullCounts[serialize($b)]  $fullCounts[serialize($a)]);

性能考量:对于非常庞大的数据集,此方法涉及两次遍历(一次用于计数,一次用于排序)。在极端性能敏感的场景下,可能需要考虑更优化的算法或数据库层面的处理。

排序稳定性:usort 在PHP中不保证排序的稳定性。这意味着如果两个子数组的出现次数相同,它们在排序后的相对位置可能无法预测。如果需要保持相同出现次数元素的原始相对顺序,可能需要采用其他更复杂的稳定排序算法

代码可读性与维护:尽管该方法有效,但组合多个函数可能使代码在初看时略显复杂。添加清晰的注释对于代码的可读性和未来的维护至关重要。

总结

通过巧妙地组合 array_column()、array_count_values() 和 usort() 这三个PHP内置函数,我们可以高效且灵活地实现多维数组按子数组元素出现频率的复杂排序需求。理解这些函数的协同工作方式,不仅能解决当前的排序问题,也为处理PHP中其他复杂数据操作提供了宝贵的思路。在实际应用中,根据具体需求调整排序依据和考虑PHP版本兼容性,可以确保代码的健壮性和可维护性。

以上就是PHP多维数组按子数组出现次数排序教程的详细内容,更多请关注php中文网其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP递归函数如何实现递归替换_PHP递归函数进行字符串递归替换的方法
上一篇 2025年12月12日 19:47:12
PHP与MySQL日期时间处理:从用户输入到数据库存储与显示优化教程
下一篇 2025年12月12日 19:47:18

相关推荐

  • PHP三元运算符和if如何选_PHP三元运算符与if选择指南

    三元运算符适用于简单赋值或返回值,如条件赋值、模板输出;if语句适合复杂逻辑、多分支或多操作场景。性能差异可忽略,应优先考虑可读性和维护性。两者可结合使用,分工明确更清晰。 在PHP开发中,三元运算符和if语句都能实现条件判断,但它们适用的场景不同。选择合适的方式能让代码更清晰、易维护。关键不是“哪…

    2026年9月23日
    100
  • Java JSON字符串有效性验证:基于栈的实现与常见陷阱

    本文深入探讨了使用Java栈结构验证JSON字符串有效性的方法。通过分析一个常见错误示例,详细阐述了在处理括号、方括号以及字符串引号时的正确逻辑,特别强调了字符串内部字符(包括转义字符)不应影响结构平衡的原则,并提供了改进思路,旨在帮助开发者构建健壮的JSON验证器。 JSON结构与栈的适用性 JS…

    2026年9月23日
    000
  • php数据如何防止CSRF跨站请求伪造_php数据表单令牌安全机制

    防止CSRF的核心是验证请求来源合法性,常用方法为表单令牌机制。1. 生成并存储CSRF令牌:用户访问表单页面时,PHP使用session_start()开启会话,通过bin2hex(random_bytes(32))生成安全令牌,存入$_SESSION[‘csrf_token&#821…

    2026年9月23日
    000
  • QQ阅读电子书官网_QQ阅读官方下载地址

    QQ阅读电子书官网是yuedu.reader.qq.com,该网站提供小说、杂志、漫画等多种数字内容,支持多设备同步与个性化阅读设置。 QQ阅读电子书官网地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来QQ阅读电子书官网,感兴趣的网友一起随小编来瞧瞧吧! https://yuedu.3…

    2026年9月23日
    000
  • Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit虽无一键AI裁剪,但通过魔棒、智能移动等智能工具辅助选区,结合裁剪功能可高效精准裁剪;关键在于利用颜色识别与对象分离技术提升效率,避免纯手动操作,再通过调整比例、放大细节、善用撤销等功能优化结果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日 用户投稿
    000
  • VSCode调试JavaScript代码(详细图解,前端必学技能)

    掌握VSCode调试JavaScript需先安装Node.js和VSCode,创建项目及app.js文件后,配置launch.json,设置断点并启动调试,通过变量面板和控制台检查值,结合条件断点、日志点、监听表达式等技巧提升效率;调试浏览器代码需安装Chrome或Edge调试插件,配置url和we…

    2026年9月23日
    200
  • 配置php递归函数处理递归转换_通过php递归函数转换数据格式

    递归函数通过自我调用处理树形结构,需有终止条件和问题缩小机制;示例中将扁平数组按parent_id构建为嵌套树,反之亦可展平为带层级的列表,适用于菜单、分类等无限级数据操作。 在PHP开发中,经常需要处理树形结构数据,比如分类、菜单、评论嵌套等。这类数据通常具有父子关系,且层级不确定,这时就需要使用…

    2026年9月23日
    100
  • UC浏览器官方网页版登录入口 UC浏览器最新官网链接

    UC浏览器官方网页版登录入口在官网https://www.ucweb.com/,点击顶部“网页版”选项并登录账号即可使用。 UC浏览器官方网页版登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来UC浏览器最新官网链接,想了解UC浏览器功能特点的网友一起随小编来瞧瞧吧! https:/…

    2026年9月23日
    700
  • 优化 Laravel Nova 动作响应消息的持久性与交互性

    本文探讨了 Laravel Nova 动作响应消息(toast 提示)持续时间过短的问题,尤其对于耗时较长的操作,默认提示难以满足用户反馈需求。我们提出并详细介绍了如何利用 Laravel Nova 4 的通知功能,实现持久化且可交互的用户通知,从而有效解决传统 toast 消息的局限性,提升用户体…

    2026年9月23日
    400
  • Reflection AI 完成 20 亿美元融资,打造“开放智能”

    美国人工智能初创企业 reflection ai 宣布成功募集 20 亿美元资金,其中英伟达领衔投资 8 亿美元,推动公司估值跃升至 80 亿美元。这家成立仅一年的科技新星,致力于打造“人人可及的前沿开放智能(open intelligence)”。 Reflection AI 表示,已集结一支由顶…

    2026年9月23日
    500
  • PHP数组中内嵌JSON字符串值的解析与访问教程

    本教程详细介绍了如何在PHP中高效地解析和访问包含JSON格式字符串的数组元素。通过使用json_decode()函数,可以将这些JSON字符串转换为可操作的PHP数组或对象,从而轻松提取所需的shortname和fullname等字段值,并提供了遍历和直接访问的示例代码及注意事项。 在php开发中…

    2026年9月23日
    200
  • 火狐浏览器官方最新版 Firefox电脑版安装入口

    火狐浏览器官方最新版Firefox电脑版安装入口在https://www.mozilla.org/zh-CN/firefox/new/,该页面提供具备强大隐私保护、高效渲染和跨设备同步功能的最新版本下载。 火狐浏览器官方最新版 Firefox电脑版安装入口在哪里?这是不少网友都关注的,接下来由PHP…

    2026年9月23日
    200
  • 如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    Optuna通过智能搜索与剪枝机制,显著提升AI大模型超参数优化效率。它以目标函数封装训练流程,利用TPE等算法智能采样,结合ASHA等剪枝策略,在分布式环境下高效搜索最优配置,同时提供可复现性与可视化分析,降低调参成本。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月23日 用户投稿
    100
  • Vue.js 项目中实现练习进度保存的策略与实践

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

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

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

    2026年9月23日
    200
  • Photopea中AI图片如何导出为PNG?快速保存图像的实用方法

    答案:在Photopea中导出AI生成图片为PNG,需点击“文件”→“导出为”→选择PNG,设置质量100%、勾选透明度并确认尺寸后保存;为平衡质量与文件大小,优先调整图像尺寸而非降低质量,高分辨率图片可缩放以优化;常见技巧包括使用高分辨率源图、保留图层非破坏性编辑;其他格式如JPEG适合无透明背景…

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

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

    2026年9月23日
    100
  • Airtable的AI混合工具怎么用?快速管理数据的智能化操作步骤

    Airtable的AI混合工具通过将AI能力嵌入数据管理流程,实现自动化处理、分析与内容生成。首先明确AI需求,如总结反馈或生成文案;接着选择AI字段或在自动化中添加AI动作;然后配置模型与提示词,精准设计指令以确保输出质量;指定输入输出字段后进行测试迭代,优化提示词直至满意;最后部署并持续监控。该…

    2026年9月23日
    200
  • Steam同时在线4166万破纪录!《战地6》首发立大功

    Steam同时在线4166万破纪录!《战地6》首发立大功Steam同时在线4166万破纪录!《战地6》首发立大功Steam同时在线4166万破纪录!《战地6》首发立大功Steam同时在线4166万破纪录!《战地6》首发立大功

    全球最大pc游戏平台steam于10月12日晚再度刷新历史纪录,同时在线用户数突破4166万(41,666,455),创下该平台自上线以来的最高峰值。 这一里程碑的达成,很大程度上得益于EA旗下射击大作《战地6》的正式发售。游戏上线后迅速吸引大量玩家,最高同时在线人数达到74万,目前已经成为Stea…

    2026年9月23日 用户投稿
    300
  • AO3镜像站替代访问链接_AO3镜像站官方镜像站点

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

    2026年9月23日
    100

发表回复

登录后才能评论
关注微信