
本文介绍如何在 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 开发规范(建议启用严格模式)。
此方法兼顾性能、可维护性与语义清晰度,是处理播放列表、商品清单、日志聚合等“去重+计数”类需求的理想实践。











