欢迎您访问新疆栾骏商贸有限公司,公司主营电子五金轴承产品批发业务!
全国咨询热线: 400-8878-609

新闻资讯

技术学院

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);

? 输出效果:

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 开发规范(建议启用严格模式)。

此方法兼顾性能、可维护性与语义清晰度,是处理播放列表、商品清单、日志聚合等“去重+计数”类需求的理想实践。