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

如何在php中基于关联数组中的重复子字符串删除/过滤数组元素?,php,arrays,json,filter,Php,Arrays,Json,Filter,我想删除类似的基于标题的价值观,例如,如果我有蕾哈娜-工作Ft。其他一些词和蕾哈娜-工作,我只想有其中一个。我怎样才能消除重复仍然为蕾哈娜搜索。请参见下面包含类似标题的json: 表示我不希望在我的阵列中有多个版本的歌曲 请参见下面要作为单一版本过滤掉的JSON示例 { “视频”:[ { “种类”:“youtube播放项目”, “etag”:“gMxXHe-zinKdE9lTnzKu8vjcmDI/134M9MAQODR9PAPI2TDE24XHDU”, “id”:“UEXWWEEXSXFCZ

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

表示我不希望在我的阵列中有多个版本的歌曲 请参见下面要作为单一版本过滤掉的JSON示例

{
“视频”:[
{
“种类”:“youtube播放项目”,
“etag”:“gMxXHe-zinKdE9lTnzKu8vjcmDI/134M9MAQODR9PAPI2TDE24XHDU”,
“id”:“UEXWWEEXSXFCZ2VAUXPYOFH2Y0U0R0RSCEFPTJAZZGNI5EQUE1NTFDRJCWMDG0NEMZ”,
“片段”:{
“发布日期”:“2016-07-03T16:45:08.000Z”,
“channelId”:“UCOB0YWX9E9SFBCTQSKKGQ”,
“标题”:“蕾哈娜-德雷克英尺作品(音频)”,
},
“shuffle_id”:88
},
{
“种类”:“youtube播放项目”,
“etag”:“gMxXHe-zinKdE9lTnzKu8vjcmDI/Qeo1vUZh73p7gX3EFvVxRGbTxms”,
“id”:“UEXAOW5LBUS1DVVCNN2RLD6ZDRWCFA0MHZ3NLZHLXZFES5ENDU4Q0M4RDEXNZM1MJCY”,
“片段”:{
“发布日期”:“2016-08-31T04:42:26.000Z”,
“信道ID”:“UC2mUsMtec7AOG9K-4ZlO7gA”,
“标题”:“蕾哈娜-工作(明确)德雷克英尺”,
“说明”:“,
“channelTitle”:“Dickinson Kenneth”,
“播放ID”:“plz9nkmk5uubrsvwzd4vpp40vw6va”,
“立场”:17,
},
“shuffle_id”:219
}]

}
因此,您可以定义一个散列函数,为相似的歌曲标题返回相同的散列;然后,您可以基于该散列值使歌曲列表唯一

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

$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
你可以在这里看到它:

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

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

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


如果您需要更精确的结果,这意味着您不仅对常用字母的数量感兴趣,而且对它们的顺序感兴趣,那么您正在寻找最长的常用子字符串问题。在这里,您必须建立一个与最大子字符串长度/原始字符串长度之比相比较的阈值。

正如您通过元素的不同值所看到的,因此它们是不同的,因此这两个轨迹对于程序是不同的。现在你可能需要实现一个与你相似的逻辑,在这个基础上你可以过滤这就是我要问的…这个逻辑你可以为歌曲标题定义一个哈希函数。我的想法是,对于两个不同但相似的歌曲标题,哈希函数会给出相同的结果。那可能是什么哈希函数逻辑?我现在正在写:)谢谢。。。久经考验。。但蕾哈娜-工作德雷克英尺(音频)和蕾哈娜-工作德雷克英尺(显式)并不是硬编码的一个,他们是在飞行中出现在API。。。所以这些可以是任何值,你必须定义所有的噪音词,比如Explict或audio,但它们可以是任何:'(我只希望蕾哈娜在那里,作为曲目名工作,而不是其他曲目工作