我几个月前创建了这个应用程序:
http://www.mondofacto.com/word-tools/scrabble-solver.html
该应用程序允许用户输入他们给出的字母集,并回显他们可以使用的有效单词,以及他们使用这些字母获得的分数.
基本上,我想要做的是扩展应用程序,以便用户可以输入“空白区块” – 即可以符合字母表中26个字母中的任何一个的空白区块,并回显有效的单词.
下面是数据库结构的屏幕截图.
http://i37.tinypic.com/28v6a8h.png
您可能需要将该^复制到浏览器中.
当用户输入例如“aardvark”时,对该数据运行的查询如下:
SELECT * FROM scrabble WHERE a <= 3 AND b <= 0 AND c <= 0 AND d <= 1 AND e <= 0 AND f <= 0 AND g <= 0 AND h <= 0 AND i <= 0 AND j <= 0 AND k <= 1 AND l <= 0 AND m <= 0 AND n <= 0 AND o <= 0 AND p <= 0 AND q <= 0 AND r <= 2 AND s <= 0 AND t <= 0 AND u <= 0 AND v <= 1 AND w <= 0 AND x <= 0 AND y <= 0 AND z <= 0 AND length <= 8 ORDER BY scrabble DESC
如果你想看到结果,请在我在顶部发布的链接中输入一个单词.
对,
所以有人知道如何做到这一点吗?我已经开始使用以下代码,如果他们在(空格是空白区域)中放置空格,则将每个字母字符附加到用户输入的字符串的末尾.
if (preg_match('/[\s]/', $string)) {
$wild_string = $string;
foreach (range('a','z') as $i) {
$wild_string = $string;
$wild_string .= $i;
}
$wild_string变量是每个字母附加到循环上的变量.通过在每个循环上将其重置为初始字符串,它会阻止代码将所有26个字母添加到输入的字符串中.
我希望有人可以提供帮助,如果我有胡扯,我很抱歉:)
安迪.
最佳答案 我的建议如下:
假设用户输入为:ab *其中*是通配符.计算所有已知字母和通配符并创建一个数组,其中元素0是通配符的数量,每个其他元素键是一个已知字母,其值为用户输入中给出的次数:
function GetArrayLetters($userInput) {
...
// produces something like $letters = ( 0 => 1, 'a' => 1, 'b' => 1);
return $letters;
}
使用该数组通过在每个字母和单词的长度中添加通配符的数量来修改您的查询:
# with only one wildcard, the query will become:
SELECT * FROM scrabble WHERE a <= 2 AND b <= 2 AND c <= 1 ....
... AND length <= 3
现在将结果放在某处(数组)并依次检查每个单词.浏览每个字母,并从$letters数组中的每个已知字母中减去一个字母;如果已知字母的值为零,则从元素0中减去(通配符).如果您获得通配符的负值,则丢弃该单词:
foreach ($result_set AS $word) {
$letters = GetArrayLetters($userInput);
for ($i = 0; $i < str_len($word); $i++) {
$letter = substr($word, $i, 1);
if ( array_key_exists( $letter, $letters )) {
if ($letters[$letter]) > 0 {
$letters[$letter] -= 1;
} else {
$letters[0] -= 1; // else subtract from the wildcard
}
} else {
$letters[0] -= 1;
}
if ($letters[0] < 0) {
// if wildcard falls bellow zero, discard the word
}
}
}