有没有办法让我从相似但不相同的针头中找到阵列中的物品?
例如:我想在数组中找到“ Allan”,但拉出“ Alan”
这可能吗?
答案 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"
正如我在评论中所说的,另一个答案是,音调比音质更好。关键是音调可以让您设置长度,该长度可以根据针的长度动态变化。具体是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
)