我正在尝试用php-mysql为anagram finder编写一个程序。。我在数据库中有一个字典,它只有一个名为"word"的字段,它包含500000行。
通过使用php,我试图从数据库中一个接一个地提取单词。。在得到一个单词后,我创建了2个循环,用于逐字符比较。。
例如。。让输入单词为"abcdef"。。
考虑一下我正在从数据库中获取单词"fade"。。
我正在写一个循环,检查单词fade是否在abcdef中。。如果是的话,我正在打印单词。。如果没有,我将从数据库中获取下一个单词。。
代码是我写的。。但是我得到了一个空页面作为输出。。请帮忙。。
我还有一个问题。有没有其他方法可以在不使用逐字符比较的情况下找到单词的子字符串?
例如:如果我的输入是fedcba。。我把它分类为abcdef。。字典里的单词是fade,我把它归类为adef。。是用于查找adef是否是abcdef的子字符串的任意函数。。
您必须编写自己的用户定义函数才能获得排序的字符串:
CREATE FUNCTION fn_sort_string(arg_word VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
DROP TEMPORARY TABLE IF EXISTS temp;
CREATE TEMPORARY TABLE temp(letter CHAR(1));
SET @var_counter = 0;
SET @var_len = LENGTH(arg_word);
WHILE(@var_counter < @var_len)
DO
INSERT INTO temp VALUES (SUBSTRING(arg_word, @var_counter, 1));
SET @var_counter = @var_counter + 1;
END WHILE;
SELECT GROUP_CONCAT(DISTINCT letter ORDER BY letter SEPARATOR '')
INTO @var_sort_word
FROM temp;
DROP TEMPORARY TABLE IF EXISTS temp;
RETURN IFNULL(@var_sort_word, "");
END;
以下查询将在已排序的字典单词中找到已排序的输入单词:
SELECT *
FROM dictionary
WHERE fn_sort_string(input_word) LIKE CONCAT('%',fn_sort_string(word),'%');
忘记在PHP中检查每个单词。这简直是CPU的噩梦!
在表格中添加第二列,并按字母顺序拼写单词。例如:
Word : AlphaWord
Test : estt
然后你可以简单地运行这样的查询:
select word from table 1 where AlphaWord = (select AlphaWord from table1 where word='$yourWord') order by word asc;
编辑:如果你不想匹配其他单词中的单词,你可以在AlphaWord列上弹出全文搜索索引,然后使用match()。。。against()语法,它将非常快地返回匹配项。然而,由于该运算符只允许在搜索字符串的末尾放置通配符,因此它不会将machete->aceehmt
与ache->aceh
匹配。话虽如此,老实说,你也不能在正常搜索中添加与它们匹配的通配符。