具有多个关键字和排序结果的PHP搜索数组

pat*_*eek 5 php

我有一个计划从我准备的txt文件进行搜索,txt文件内容类似于下面这样

A.TXT

Amy Jefferson
Nathalie Johnson
Emma West
Donna Jefferson
Tanya Nathalie
George West
Emma Watson
Emma Jefferson
Run Code Online (Sandbox Code Playgroud)

如果代码是这样的

a.php只会

$filename = "a.txt";
$example = file($filename, FILE_IGNORE_NEW_LINES);
$searchword = 'Emma Jefferson';
$matches = array();
foreach($example as $k=>$v) {
    if(preg_match("/\b$searchword\b/i", $v)) {
        $matches[$k] = $v;
        echo $matches[$k]."<br>";
    }
}
Run Code Online (Sandbox Code Playgroud)

结果只会是"艾玛杰斐逊"

然后,如果我使用此代码

b.php

$filename = "a.txt";
$example = file($filename, FILE_IGNORE_NEW_LINES);
$searchword = 'Emma Jefferson';
$matches = array();
foreach($example as $k=>$v) {
    $searchword2 = str_ireplace(" ", "|", $searchword);
    if(preg_match("/\b$searchword2\b/i", $v)) {
        $matches[$k] = $v;
        echo $matches[$k]."<br>";
    }
}
Run Code Online (Sandbox Code Playgroud)

结果将是这样的

Amy Jefferson
Emma West
Donna Jefferson
Emma Watson
Emma Jefferson
Run Code Online (Sandbox Code Playgroud)

独特的结果,但最后的结果是"艾玛杰斐逊"

所以问题是我如何搜索艾玛杰斐逊,结果排序是这样的

Emma Jefferson
Emma Watson
Emma West
Amy Jefferson
Donna Jefferson
Run Code Online (Sandbox Code Playgroud)

所以基本上它首先搜索"Emma Jefferson"的全部单词,然后是"Emma",最后一个是"Jefferson"

更新 我为这个问题投票选择Do not Panic代码,但是我想说谢谢你们在这里的所有贡献者不要恐慌,RomanPerekhrest,Sui Dream,Jere,i-man,你们所有人都是最棒的!

Pattygeek

Don*_*nic 1

我不知道有什么方法可以使用正则表达式解决方案考虑匹配的位置,但是如果将搜索字符串和术语转换为单词数组,就可以完成。

通过这种方法,我们迭代文本项并为搜索词中的每个单词构建一个位置匹配数组,然后按匹配数量和匹配位置对结果进行排序。

$search_words = explode(' ', strtolower($searchword));

foreach ($example as $item) {
    $item_words = explode(' ', strtolower($item));

    // look for each word in the search term
    foreach ($search_words as $i => $word) {
        if (in_array($word, $item_words)) {

            // add the index of the word in the search term to the result
            // this way, words appearing earlier in the search term get higher priority
            $result[$item][] = $i;
        }
    }
}

// this will sort alphabetically if the uasort callback returns 0 (equal)
ksort($result);

// sort by number of matches, then position of matches    
uasort($result, function($a, $b) {
    return count($b) - count($a) ?: $a <=> $b;
});

// convert keys to values    
$result = array_keys($result);
Run Code Online (Sandbox Code Playgroud)

  • @Don'tPanic,你应该提到 `&lt;=&gt;` 仅自 PHP 7 起可用 (2认同)