首先,我没有示例代码,我请求关于这是否可行的建议,以及一些关于如何.的建议。
我被要求创建一个PHP脚本来搜索我们的Windows通讯簿。为了让事情变得尴尬,我被要求这样做,所以前端看起来像一个电话键盘,用户使用号码簿输入名字。
在我看来,数字将与字母相关,如:
2 = ABC
3 = DEF
4 = GHI
5 = JKL
6 = MNO
7 = PQRS
8 = TUV
9 = WXYZ我能看到两种不同的方法。
我可以看到的另一个问题是,我需要知道用户输入了哪个数字,以及在字符串中的时间。
用户输入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.有谁有什么建议和建议吗?
谢谢
发布于 2013-03-05 19:06:30
我同意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 -请记住,如果您希望对两者进行过滤,则过滤器的大小会增加一倍,这可能会导致较慢的LDAP请求。
要筛选输入6、4、5的所有可能结果,您可以调用:
$ds = ldap_connect("...");
$result = ldap_search($ds, "...", getFilterForDigits(array(6, 4, 5)));我仍然强烈建议您不要这样做,但是如果您的手被束缚了,请确保您实现了某种类型的缓存。:)
发布于 2013-03-07 09:36:27
当然,这限制了对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;
}
}
}https://stackoverflow.com/questions/15219776
复制相似问题