PHP 中合并重复音乐条目并累加 REPEAT 计数的实用教程
发布时间 - 2026-01-05 00:00:00 点击率:次本文介绍如何在 php 中高效识别并合并数组中具有相同 artist 和 title 的音乐条目,自动保留唯一记录并将所有重复项的 repeat 值累加,适用于播放列表去重与统计场景。
在构建音乐播放列表等实际应用中,数据库查询结果常包含大量语义重复的数据(如同一首歌多次出现)。与其在 SQL 层做复杂 GROUP BY + COUNT(可能丢失原始字段结构),不如在 PHP 数组层面进行精准去重与计数聚合。核心目标是:对 ARTIST 和 TITLE 完全相同的条目,仅保留一条,并将其 REPEAT 字段更新为出现总次数。
以下是一个简洁、可读性强且生产可用的解决方案:
function mergeDuplicateTracks(array $playlist): array
{
$merged = [];
foreach ($playlist as $track) {
// 构建唯一键:基于 ARTIST + TITLE(可按需扩展 TIME 等字段)
$key = $track['ARTIST'] . '|' . $track['TITLE'];
if (isset($merged[$key])) {
// 已存在:累加 REPEAT,其他字段保持首次出现的值(如 ID、TIME)
$merged[$key]['REPEAT'] += $track['REPEAT'];
} else {
// 首次出现:深拷贝原始条目(避免引用干扰)
$merged[$key] = $track;
}
}
// 重置数组索引,返回纯数字索引数组
return array_values($merged);
}✅ 使用示例:
$music_playlist = [
['ID' => 0, 'ARTIST' => 'SOMETHING1'
, 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 1, 'ARTIST' => 'SOMETHING2', 'TITLE' => 'SOMETHING2', 'TIME' => '02:40', 'REPEAT' => 1],
['ID' => 2, 'ARTIST' => 'SOMETHING3', 'TITLE' => 'SOMETHING3', 'TIME' => '03:20', 'REPEAT' => 1],
['ID' => 3, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 4, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 5, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 6, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
];
$result = mergeDuplicateTracks($music_playlist);
print_r($result);? 输出效果:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => Array
(
[ID] => 0
[ARTIST] => SOMETHING1
[TITLE] => SOMETHING1
[TIME] => 04:00
[REPEAT] => 5
)
[1] => Array
(
[ID] => 1
[ARTIST] => SOMETHING2
[TITLE] => SOMETHING2
[TIME] => 02:40
[REPEAT] => 1
)
[2] => Array
(
[ID] => 2
[ARTIST] => SOMETHING3
[TITLE] => SOMETHING3
[TIME] => 03:20
[REPEAT] => 1
)
)⚠️ 注意事项:
- 该方案以 ARTIST|TITLE 为唯一标识符,若需更高精度(如区分不同版本),可将 TIME 或自定义 ALBUM_ID 加入 $key 拼接;
- ID 字段保留的是首次出现的记录 ID,如需保留最小/最大 ID,可在 else 分支中添加逻辑;
- 时间复杂度为 O(n),远优于原答案中每轮遍历 $filtered 的 O(n²) 方案,尤其适合千级以上条目;
- 函数声明明确使用 array 类型提示与返回类型,符合现代 PHP 开发规范(建议启用严格模式)。
此方法兼顾性能、可维护性与语义清晰度,是处理播放列表、商品清单、日志聚合等“去重+计数”类需求的理想实践。
# php
# 音乐
# red
# sql
# Array
# count
# 标识符
# 严格模式
# 数据库
# 首次
# 的是
# 是一个
# 遍历
# 适用于
# 可在
# 更高
# 并将
# 自定义
# 可将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Bootstrap CSS布局之列表
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
如何获取PHP WAP自助建站系统源码?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
黑客如何通过漏洞一步步攻陷网站服务器?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
JavaScript如何实现路由_前端路由原理是什么
如何在VPS电脑上快速搭建网站?
详解MySQL数据库的安装与密码配置
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
动图在线制作网站有哪些,滑动动图图集怎么做?
Laravel Fortify是什么,和Jetstream有什么关系
大同网页,大同瑞慈医院官网?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何在阿里云虚拟主机上快速搭建个人网站?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
清除minerd进程的简单方法
如何快速查询网站的真实建站时间?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
网站图片在线制作软件,怎么在图片上做链接?
C语言设计一个闪闪的圣诞树
JS经典正则表达式笔试题汇总
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
详解Android中Activity的四大启动模式实验简述
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何挑选优质建站一级代理提升网站排名?
Windows Hello人脸识别突然无法使用
如何在腾讯云服务器快速搭建个人网站?
如何破解联通资金短缺导致的基站建设难题?
如何在宝塔面板中修改默认建站目录?
android nfc常用标签读取总结
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel怎么在Blade中安全地输出原始HTML内容
佛山网站制作系统,佛山企业变更地址网上办理步骤?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
JS实现鼠标移上去显示图片或微信二维码
Laravel如何使用Blade模板引擎?(完整语法和示例)
iOS正则表达式验证手机号、邮箱、身份证号等
javascript中的数组方法有哪些_如何利用数组方法简化数据处理


, 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 1, 'ARTIST' => 'SOMETHING2', 'TITLE' => 'SOMETHING2', 'TIME' => '02:40', 'REPEAT' => 1],
['ID' => 2, 'ARTIST' => 'SOMETHING3', 'TITLE' => 'SOMETHING3', 'TIME' => '03:20', 'REPEAT' => 1],
['ID' => 3, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 4, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 5, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
['ID' => 6, 'ARTIST' => 'SOMETHING1', 'TITLE' => 'SOMETHING1', 'TIME' => '04:00', 'REPEAT' => 1],
];
$result = mergeDuplicateTracks($music_playlist);
print_r($result);