我在我的数据库中实现了一个搜索栏。我解释说我在我的数据库中有两个用户:“James Da”和“Paul Mo”我希望当用户搜索“James”时,这将显示“James Da”但我也希望当他寻找“Da”时将展示“詹姆斯达,当他寻找”艾姆斯“时,它将展示”詹姆斯达“......
我的功能只实现了第一种情况:
public function userSearch()
{
$users = [];
$request = Request::createFromGlobals();
$name = $request->query->get('name');
$directoryService = $this->get('etiam_nexus_directory.service.directory');
$localEstablishment = $directoryService->getLocalEstablishment();
$allUsers = $directoryService->getAllUsers($localEstablishment, $_GET);
for ($i = 0; $i <= count($allUsers); $i++) {
$user = $allUsers[$i];
if (substr(strtolower($user->getUserFullName()), 0, strlen($name)) === strtolower($name)) {
$users[] = '@' . $user->getUseruniqname() . ":server";
}
}
if(count($users) == 0) {
return JsonResponse::create(
array(
'success' => false,
'research' => $name
)
);
}
return JsonResponse::create(
array(
'success' => true,
'research' => array (
'name' => $users
)
)
);
}
考虑到空间,我应该使用其他条件吗?
您目前只检查第一个案例:
substr(strtolower($user->getUserFullName()), 0, strlen($name)) === strtolower($name)
substr(strtolower($user->getUserFullName()), 0, strlen($name))
将从用户名中删除第一部分,该用户名最多与搜索到的名称一样多。由于您进行了相同的检查,因此您只需检查完整用户名是否以用户刚刚输入的名称开头。
相反,你可以简单地使用stripos
if (stripos($user->getUserFullName(), $name) !== FALSE) {
$users[] = '@' . $user->getUseruniqname() . ':server';
}
这将检查用户输入的字符串是否是用户名的一部分,同时不区分大小写。像'ames'
这样的规则会找到'James Do'
,它似乎是准确的。