2017-01-31 27 views
0

我想刪除類似的基於標題的值,例如。如果我有蕾哈娜 - 工作英尺。其他一些單詞和蕾哈娜 - 工作我只想要其中的一個。我如何刪除仍在搜索Rihanna的重複內容。見下面的JSON包含類似的標題:如何根據php中的關聯數組中的重複子字符串來移除/過濾數組元素?

意味着我不希望有一個歌曲的多個版本在我的數組 見以下舉例JSON被過濾掉單VERSION

{ 
 
     "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 
 
     }] 
 
\t }

+0

正如你所看到的元素的不同價值,所以他們是不同的,因此這兩個軌道是不同的程序。現在你可能需要按照你的邏輯來實現它,這樣你就可以過濾 –

+0

這就是我所要求的......邏輯 –

+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; 
} 
+0

謝謝你...試用過..但蕾哈娜 - 工作英尺德雷克(音頻)和蕾哈娜 - 工作(明確)英尺德雷克是不硬編碼,他們出現在飛API ...所以這可能是任何值 –

+0

是的,你必須定義所有噪音詞像Explict或Audio –

+0

但是它們可以是任何一種:'(我只想讓Rihanna在那裏工作作爲音軌名稱而沒有其他音軌與工作 –

0

您可以檢測使用similar_text功能的相似性,並決定閾值來告訴兩個冠軍(或更多)的相似程度足以去除其中的一個(最短?)。

如果您需要更準確的結果,這意味着您不僅對常用字母的數量感興趣,而且對它們的順序感興趣,那麼您正在尋找最長的公共子字符串問題,here is an implementation。在這裏,你必須建立一個閾值,與比例largestSubstringLength/OriginalStringLength比較。

相關問題