在数组PHP中进行类似的查找

时间:2018-10-10 20:47:51

标签: php arrays

有没有办法让我从相似但不相同的针头中找到阵列中的物品?

例如:我想在数组中找到“ Allan”,但拉出“ Alan”

这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试在array_filter匿名函数中使用metaphone和相似文本函数。

 $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 )

答案 1 :(得分:0)

使用Metaphone

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

正如我在评论中所说的,另一个答案是,音调比音质更好。关键是音调可以让您设置长度,该长度可以根据针的长度动态变化。具体是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