Чтобы перетасовать слова, используйте str_shuffle()
. Чтобы сравнить перетасованную строку со списком слов, вы можете использовать count_chars()
.
class WordFinder
{
protected $_wordList;
protected $_map;
public function __construct(array $wordList)
{
$this->_wordList = $wordList;
}
protected function _initMap()
{
if(!is_array($this->_map)) {
$this->_map = array();
foreach($this->_wordList as $word) {
$key = count_chars($word, 3);
if(!isset($this->_map[$key])) {
$this->_map[$key] = array();
}
$this->_map[$key][] = $word;
}
}
}
public function findWords($searchWord)
{
$searchWord = count_chars($searchWord, 3);
$this->_initMap();
if(isset($this->_map[$searchWord])) {
return $this->_map[$searchWord];
}
return false;
}
}
Затем сделайте
$list = array('evil', 'live', 'vile', 'cat');
$finder = new WordFinder($list);
var_dump($finder->findWords('evli'));
И это вернет
array(3) {
[0]=>
string(4) "evil"
[1]=>
string(4) "live"
[2]=>
string(4) "vile"
}
EDIT Я обменялся исходный код с этой версии, так как он выполняет гораздо лучше большие текстовые списки. Я протестировал выше на моем 2,2 Ghz Dual Core и завершил 10000 вызовов findWords() в коллекции из 10000 слов всего за 0,08 секунды. Другая версия займет 207 секунд. См. Версию для старой версии.
О, мой. В моем ответе я как бы выбрал слово «shuffle» из воздуха, чтобы избежать путаницы с «сортировкой», которая могла бы скрыть мой смысл. Я не знал, что 'str_shuffle' - это установленная PHP-функция, которая делает что-то совершенно другое, а именно изменение порядка символов * случайным образом *. Теперь я думаю, как решить любую путаницу, которую я, возможно, непреднамеренно создал. –
Все в порядке. Он все равно может использовать 'str_shuffle' для перетасовки слов, потому что' count_chars' вернет их в алфавитном порядке в любом случае. Нет необходимости в карте 1: 1. – Gordon