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中的数组方法有哪些_如何利用数组方法简化数据处理