【问题标题】:A Similar Find In Array PHP [closed]数组 PHP 中的类似查找 [关闭]
【发布时间】:2018-10-10 20:47:51
【问题描述】:

有没有办法让我从相似但不相同的针中找到数组中的项目?

例如:我想在一个数组中找到'Allan',但拉出'Alan'

这是可能的吗?

【问题讨论】:

  • php 函数:levenshtein()similar_text()
  • 啊,是的,谢谢,levenshtein() 正是我所需要的!不知道怎么找不到这个
  • Metaphone 也是一种选择。我使用两者的组合(变音位和 levenshtein),但在数据库中:-p。 levenshtein 实际上比 metaphone 差一些,因为 metaphone 可以预先计算,从而提高了性能。例如在 DB 中,您可以将变音位值存储在字段中,但在搜索完成之前无法找到 levenshtein 值。

标签: php arrays


【解决方案1】:

使用变音器

function soundsLike($needle, $haystack){
    $sounds = metaphone($needle);
    foreach($haystack as $item){
        if( $sounds == metaphone($item, strlen($sounds)))return $item;
    }
}

echo soundsLike('will', ["trina","treena","alan","allan","William"]);

输出

"William"

Sandbox

正如我在 cmets 中所说的另一个答案,metaphone 比 soundx 更好,这里的关键是 metaphone 可以让您设置长度,可以根据针的长度动态设置。特别是strlen($sounds)

这个更好的原因是上面的例子。

 will = WL
 William = WLM

还有WL != WLM,因为我们可以将长度设置为2 WL == WL

-注意-这仅返回第一个结果,但扩展它以查找所有结果将是微不足道的。像这样

function soundsLike($needle, $haystack){
    $sounds = metaphone($needle);
    $matches = [];
    foreach($haystack as $item){
        if( $sounds == metaphone($item, strlen($sounds))) $matches[]=$item;
    }
    return $matches;
}

print_r(soundsLike('al', ["trina","treena","alan","allan","William"]));

输出

Array(
   [0] => alan
   [1] => allan
)

Sandbox

【讨论】:

    【解决方案2】:

    您可以在 array_filter 匿名函数中尝试 metaphone 和similar_text 函数。

     $items=array("trina","treena","allan","alan");
     $key="trina";
     $filteredItems = array_filter($items, function($elem) use($key){
        $s=similar_text(metaphone($elem),metaphone($key),$p);
        return ($p>80 && $elem!==$key) ; //if 80% similar
     });
     print_r($filteredItems);
    

    输出

    Array ( [1] => treena )
    

    【讨论】:

    • 我会使用metaphone,例如metaphone($elem, 3),所以它的长度相同(只是metaphone比soundx更好的原因之一),并且不需要在2个字符串上使用=== .
    • 谢谢队友,我已经编辑了我的答案。如果您的回答是相关的,我很乐意删除它
    • 你也可以留下你的,不用担心。我做了很多关于名字的工作,令人惊讶的是它们的变化,这是我从未考虑过的......哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2010-12-09
    • 2012-07-14
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多