我正在尝试在php mysql中为anagram finder编写一个程序..我在数据库中有一个字典,它只有一个名为'word'的字段,它包含500000行。
通过使用php我试图从数据库逐个拉出单词。在得到一个单词后,我创建了2个for循环,执行逐字符比较..
例如..让输入的单词为'abcdef'..
考虑我从数据库中取出'fade'这个词。
我正在写一个循环并检查单词fade是否在abcdef中...如果是,我正在打印单词..如果没有,我将从数据库中取出下一个单词..
我写了代码..但我得到一个空页作为输出..请帮助..
我还有一个问题。有没有其他方法来找到一个单词的子串而不使用逐字符比较?
例如:如果我的输入是fedcba ..我将其排序为abcdef .. 和字典单词是淡入淡出,我把它排序为adef ..是任何函数来查找adef是否是abcdef的子字符串..
答案 0 :(得分:2)
您必须编写自己的用户定义函数以获取已排序的字母串:
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),'%');
答案 1 :(得分:1)
忘记检查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
匹配。话虽如此,说实话,你不能在正常搜索中添加一个符合它们的通配符。