1

PHP mysql でアナグラム ファインダー用のプログラムを作成しようとしています。データベースに辞書があり、「単語」という名前のフィールドが 1 つだけあり、500000 行が含まれています。

PHPを使用して、データベースから単語を1つずつ取得しようとしました..単語を取得した後、文字ごとの比較を実行する2つのforループを作成しました..

たとえば..入力単語を「abcdef」にします..

データベースから「フェード」という単語を取得していると考えてください..

私はループを書いて、フェードという単語がabcdefにあるかどうかをチェックしています..はいの場合、単語を印刷しています..そうでない場合は、データベースから次の単語を取得します..

私はコードを書きました..しかし、出力として空のページを取得しています..pls help..

もう1つ質問があります。文字ごとの比較を使用せずに単語の部分文字列を見つける他の方法はありますか?

例:私の入力がfedcba..の場合、abcdef..としてソートし、辞書の単語はfadeであり、adef..としてソートすると、adefがabcdefの部分文字列であるかどうかを確認する関数がthrになります。

4

2 に答える 2

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),'%');
于 2012-07-24T06:17:42.933 に答える
1

PHP で各単語をチェックするのを忘れてください。それはCPUの悪夢です!

表に 2 番目の列を追加し、単語をアルファベット順に綴ります。例えば:

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->aceehmtache->aceh. とは言っても、正直なところ、通常の検索でもそれらに一致するワイルドカードを実際に追加することはできませんでした。

于 2012-07-24T06:19:50.720 に答える