Это может показаться немного злым, но вы, вероятно, получите лучшую производительность, загрузив свой словарь в массив в форме дерева словарей, но в обратном порядке слов, например:
array(
'r' => array(
'u' => array(), // -- words ending in 'ur' would end up in here
'a' => array(), // -- words ending in 'ar' would end up here
'e' => array( // -- words ending in 'er' would end up in here
'm' => array(
'm' => array(
// -- jackhammer will be kept further up here
Тогда ищем.
$reverseWord = ""; // -- Incoming 'word' string goes here, in reverse.
$dictionary = [structure above];
$dictionaryPosition = $dictionary;
$dictionaryHistory = "";
for( $i = 0, $l = strlen($reverseWord); $i < $l; $i++ ) {
$char = $reverseWord[$i];
// -- If this character doesn't exist in this dictionary position, we've reached the end
if( !isset($dictionaryPosition[$char]) )
break;
// -- log this character
$dictionaryHistory = $char . $dictionaryHistory;
// -- Climb up the tree
$dictionaryPosition = $dictionaryPosition[$char];
}
// -- $dictionaryHistory now contains the word you're looking for.
Каждый массив должен содержать не более 26 записей (при условии, что используются только буквенные символы), так что вы смотрите на то, чтобы сделать максимум 26 * n поисков по одному символу каждый. Даже с глубиной слова 20 символов это бесконечно лучше, чем повторять список из 50 тысяч слов несколько раз.