搜索栏没有单词顺序

问题描述 投票:0回答:1

我在我的数据库中实现了一个搜索栏。我解释说我在我的数据库中有两个用户:“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
                )
        )
    );
}

考虑到空间,我应该使用其他条件吗?

php json search
1个回答
0
投票

您目前只检查第一个案例:

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',它似乎是准确的。

© www.soinside.com 2019 - 2024. All rights reserved.