3

この時点ではサンプルコードがありません。これが可能かどうかについてのアドバイスと、その方法に関するいくつかの指針を求めています..

Windows LDAP アドレス帳を検索する PHP スクリプトを作成するよう依頼されました。厄介なことに、フロントエンドが電話のキーパッドのように見え、ユーザーが数字パッドを使用して名前を入力できるようにするように依頼されました。

私が見ているように、数字は次のように文字に関連付けられます。

2 = ABC
3 = DEF
4 = GHI
5 = JKL
6 = MNO
7 = PQRS
8 = TUV
9 = WXYZ

これを行うには2つの異なる方法があります。

  1. ユーザーが最初の数字を入力すると、一致の配列の作成が開始され、2 番目と 3 番目の一致が入力されると、これが減少します。

  2. 入力された数字のリストを作成し、明示的な一致を検索します。

私が見ることができる別の問題は、ユーザーが入力した数字と文字列をいつ知る必要があるかということです。

例: ユーザーは 6 4 5 と入力します。これは次のように一致する必要があります。

M, N or O, as the first character.
G, H or I as the second character.
J, K or L as the thrid character.

誰かアドバイスや指針の提案はありますか?

ありがとう

4

2 に答える 2

0

私は Dave に同意しますが、それは本当にばかげた考えですが、手動でフィルタリング全体を行う前に、LDAP フィルターが解決策になる可能性があります。可能な組み合わせに対して巨大なフィルターを作成する必要があります。

function getCombinations(array $digits = array())
{
    $digitToLetters = array(
        2 => array('A', 'B', 'C'),
        3 => array('D', 'E', 'F'),
        4 => array('G', 'H', 'I'),
        5 => array('J', 'K', 'L'),
        6 => array('M', 'N', 'O'),
        7 => array('P', 'Q', 'R', 'S'),
        8 => array('T', 'U', 'U'),
        9 => array('W', 'B', 'Y', 'Z')
    );

    $values = array('');
    foreach ($digits as $digit) {
        $newValues = array();
        foreach ($values as $value) {
            if (array_key_exists($digits[0], $digitToLetters)) {
                foreach ($digitToLetters[$digit] as $letters) {
                    $newValues[] = $value . $letters;
                }
            }
        }
        $values = $newValues;
    }

    return $values;
}

function getFilterForDigits(array $digits = array()) {
    $combinations = getCombinations($digits);
    $filter = '(|(sn=' . implode('*)(sn=', $combinations) . '*))';
}

姓 ( sn) のみでフィルタリングすることを想定していますが、簡単に変更できるため、適合する可能性がありgivenNameます。両方をフィルタリングする場合は、フィルター サイズが 2 倍になり、LDAP 要求が遅くなる可能性があることに注意してください。

6入力,のすべての可能な結果を​​フィルタリングするには、4次の5ように呼び出します。

$ds = ldap_connect("...");
$result = ldap_search($ds, "...", getFilterForDigits(array(6, 4, 5)));

私はまだそれをしないことを強くお勧めしますが、手を縛られている場合は、何らかのキャッシュを実装してください。:)

于 2013-03-05T19:06:30.850 に答える
0

もちろん、これにより LDAP への必要な呼び出しが制限されます。最初の数字の名前をリクエストした後でも、getCombinations関数を使用して次の数字をフィルタリングできます。

function startsWith($haystack, $needle) { 
    return !strncmp(strtoupper($haystack), $needle, strlen($needle)); 
} 


$combinations = getCombinations(array(6, 4, 5));
$results = array();
foreach ($resultsForFirstDigit as $ldapEntry) {
    foreach ($combinations as $combination) {
        if (startsWith($ldapEntry['sn'], $combination) {
            $result[] = $ldapEntry;
        }
    }
}
于 2013-03-07T09:36:27.580 に答える