2013-08-06 22 views
3

我有17,000個字符串的數組。許多字符串有類似的比賽,例如:在PHP中查找頂部類似的字符串?

User Report XYZ123 
Bob Smith 
User Report YEI723 
User Report 
User Report 
Number of Hits 27 
Frank's Weekly Transaction Report 
Transaction Report 123 

什麼是找到頂級的「相似字符串」的最佳方式?例如,使用上面的示例,我希望將「用戶報告」和「交易報告」看作頂部「類似字符串」中的兩個。

+0

不應該把「最相似的」改爲「弗蘭克的每週交易報告」和「交易報告123」? – MightyPork

+1

粗略的方法是使用'levenshtein()'來確定兩個字符串之間的距離。 – Nadh

回答

0

沒有給你所有的源代碼來做到這一點,你可以通過數組並刪除你認爲無用的組件,就像任何帶有數字的字母,等等。

然後,您可以使用array_count_values()並對該數組進行排序以查看涉及的頂級數組。

-1

如果你能得到所有的字符串作爲一個數組和循環他們在一個foreach()這樣的:

$string_array = array('string', 'string1', 'string2', 'does-not-match'); 
$needle = 'string'; 

$results = array(); 
foreach($string_array as $key => $val): 
    if (fnmatch($needle, $val): 
     $results[] = $val; 
    endif; 
endforeach; 

你應該結束其匹配$needle這些條目結束。作爲替代​​你可以使用preg_match()和模式/string/i

$string_array = array('string', 'string1', 'string2', 'does-not-match'); 
$needle = '/string/i'; 

$results = array(); 
foreach($string_array as $key => $val): 
    if (!empty(preg_match($needle, $val)): 
     $results[] = $val; 
    endif; 
endforeach; 

注有使用空時(可能是問題),並通過)的preg_match的結果(:

此前PHP 5.5 ,empty()只支持變量;其他任何東西都會導致解析錯誤。換句話說,以下內容不起作用:空(trim($ name))。相反,使用trim($ name)== false。

沒有錯誤應與PHP版本5.3.x < 5.4

+0

爲什麼'fnmatch'?這太可怕了。不妨使用'md5':s – Halcyon

+1

'fnmatch()檢查傳遞的字符串是否與給定的shell通配符模式匹配。「來自PHP手冊http://php.net/manual/en/function.fnmatch.php 這使得'fnmatch()'等效於'preg_match()' –

+2

輸入是純文本,沒有正則表達式。如果其中一個輸入字符串是''。*「',看起來完全不像'」字符串「'。 – Halcyon

0

發出你可以計算Levenstein distance每串與其他人相比,然後由該值排序。

$strings = array('str1', 'str2', 'car', 'dog', 'apple', 'house', 'str3'); 
$len = count($strings); 

$distances = array_fill(0, $len, 0); 

for($i=0; $i<$len-1; ++$i) 
    for($j=$i+1; $j<$len; ++$j) 
    { 
     $dist = levenshtein($strings[$i], $strings[$j]); 
     $distances[$i] += $dist; 
     $distances[$j] += $dist; 
    } 

// Here $distances indicates how of "similar" is each string 
// The lower values are more "similar" 
0

我想你可以通過每個字符串做一個foreach和消除你不想適用於特定搜索的人。然後通過一旦你離開(可能與另一個foreach),並不斷縮小你有興趣的字符串的數量,直到有幾個。然後按照字母順序排序。