我想检查文本文件中的每个单词是否都存在于另一个大词典文本文件的“LINES”中。
我尝试过的每一种方式都失败了,或只是短暂的工作。
如果没有百万个嵌套循环,我该怎么办?
答案 0 :(得分:3)
我经常这样回答。但正则表达式会避免大部分循环。
// get words
preg_match_all(':\p{L}{2,}:u', $text_file, $words);
$words = end($words);
// make a search regex "abc|foobar|xyz|text|.."
$rx_words = implode("|", $words);
// find all words that exist on a line
preg_match_all(':^($rx_words)$:', file_get_contents("LINES"), $cmp);
// everything found if:
$found_all = !array_diff($cmp[1], $words);
使用一些额外的编码可以避免读取整个LINES
文件。但我想在这里保持简单。
答案 1 :(得分:2)
Psuedocode如果你有足够的内存:
for each line in text file:
break line into words
for each word in line:
$wordMap[lowercase($word)] = 1;
for each line:
break line into words
for each word:
if $wordMap[lowercase($word)] == 1:
line has word $word
如果$ mapMap没有足够的内存,那么将$ wordMap设为某种数据库。您也可以尝试使用bloom过滤器(http://code.google.com/p/php-bloom-filter/,http://en.wikipedia.org/wiki/Bloom_filter)。