如何基于php中的关联数组中的重复子串删除/过滤数组元素?

时间:2017-01-31 10:06:33

标签: php arrays json filter

我想删除类似的基于标题的值,例如。如果我有Rihanna - Work Ft。其他一些词和蕾哈娜 - 工作我想只有其中一个。我怎样才能删除仍然为Rihanna搜索的重复项。请参阅下面包含类似标题的json:

意味着我不想在我的阵列中拥有多个版本的歌曲 见以下样本JSON将被单独删除

    {
      "videos": [
        {
          "kind": "youtube#playlistItem",
          "etag": "\"gMxXHe-zinKdE9lTnzKu8vjcmDI/134M9maQodDR9PapI2tdE24XHdU\"",
          "id": "UExwWEExSXFCZ2VaUXpYOFh2Y0U0R0RscEFpTjAzczNGNi5EQUE1NTFDRjcwMDg0NEMz",
          "snippet": {
            "publishedAt": "2016-07-03T16:45:08.000Z",
            "channelId": "UCOb0YwX9e9SFbctQaSXkKGQ",
            "title": "Rihanna - Work ft. Drake (Audio)",
           
          },
          "shuffle_id": 88
        },
        {
          "kind": "youtube#playlistItem",
          "etag": "\"gMxXHe-zinKdE9lTnzKu8vjcmDI/Qeo1vUZh73p7gX3EFvVxRGbTxms\"",
          "id": "UExaOW5LbUs1dVVCcnN2Rld6ZDRWcFA0MHZ3NlZhLXZFeS5ENDU4Q0M4RDExNzM1Mjcy",
          "snippet": {
            "publishedAt": "2016-08-31T04:42:26.000Z",
            "channelId": "UC2mUsMtec7AOG9K-4ZlO7gA",
            "title": "Rihanna - Work (Explicit) ft. Drake",
            "description": "",
            "channelTitle": "Dickinson Kenneth",
            "playlistId": "PLZ9nKmK5uUBrsvFWzd4VpP40vw6Va-vEy",
            "position": 17,
          
          },
          "shuffle_id": 219
        }]
	}

2 个答案:

答案 0 :(得分:0)

因此,您可以定义一个哈希函数,为相似的歌曲标题返回相同的哈希值;然后,您可以根据该哈希值使歌曲列表唯一。

这是一个潜在的哈希函数和一些演示:

$hash1 = hashSongTitle('Rihanna - Work ft. Drake (Audio)');
$hash2 = hashSongTitle('Rihanna - Work (Explicit) ft. Drake');

echo $hash1 . "\n";
echo $hash2 . "\n";

$sameHash = ($hash1 === $hash2);

echo $sameHash ? 'are the same' : 'not not the same';

function hashSongTitle($title)
{
    //get rid of noise words
    $title = str_replace(array('(Explicit)', '(Audio)', '-'), '', $title);

    //collapse consecutive spaces
    $title = preg_replace('#\s{2,}#ims', ' ', $title);

    //get rid of possible white spaces in front or in the back of the string
    $title  = trim($title, "\r\n ");

    return $title;
}

这应该回应:

Rihanna Work ft. Drake
Rihanna Work ft. Drake
are the same

你可以在这里看到它:http://sandbox.onlinephpfunctions.com/code/201b95cdc80f587a0ee377155c5fb6a49475bc89

然后,您可以将歌曲存储在由该哈希值索引的数组中,这样它们就会变得唯一。

foreach($songList as $song)
{
    $hash = hashSongTitle($song->title);
    $uniqueSongList[$hash] = $song;
}

答案 1 :(得分:0)

您可以使用similar_text函数检测相似度,并确定一个阈值来判断两个标题(或更多)是否足够相似以删除其中一个(最短的?)。

如果您需要更准确的结果,这意味着您不仅对常用字母的数量感兴趣,而且还对其顺序感兴趣,那么您正在寻找最长的常见子字符串问题here is an implementation。在这里你必须建立一个阈值比较maximumSubstringLength / OriginalStringLength。