PHP匹配数组中具有正确值的键入

PHP匹配数组中具有正确值的键入,php,arrays,Php,Arrays,我不知道这在PHP中是否可行,但我想根据用户可能键入的内容检查数组中的值是否正确,以防他们键入错误。例如,我可以有这样一个数组: $correct_values = array('accounts','users','cheesecake','banana'); 如果用户提交一个字符串,比如说acounts(注意只有一个'c'),那么我想检查$correct\u values-数组,看看是否有类似的内容并返回值-在本例中返回$correct\u values[0]。如果用户提交了banan,它

我不知道这在PHP中是否可行,但我想根据用户可能键入的内容检查数组中的值是否正确,以防他们键入错误。例如,我可以有这样一个数组:

$correct_values = array('accounts','users','cheesecake','banana');
如果用户提交一个字符串,比如说
acounts
(注意只有一个'c'),那么我想检查
$correct\u values
-数组,看看是否有类似的内容并返回值-在本例中
返回$correct\u values[0]
。如果用户提交了
banan
,它应该返回
$correct\u值[3]


PHP中是否存在允许我检测此问题的现有函数?或者我需要创建一个包含所有常见错误的
$common\u typos
-数组,并返回
$correct\u values
的数组键吗?

这基本上就是该方法的目的。在您的用例中,您需要遍历
$correct\u values
中的每个条目,计算两个字符串之间的Levenshtein距离,并选择距离最小的一个(或者如果超过某个值,则不返回结果,例如2)


例如:

/**
 * Returns the closest Levenshtein match
 * @param string $input 
 * @param array $correct_values
 * @param int $threshold
 * @return null|string Either the closest-matching string or null
 */
public function getCloseMatch($input, $correct_values = array(), $threshold = 2) {
    $closest_match = array('value' => null, 'distance' => null);
    foreach($correct_values as $value) {
        $distance = levenshtein($input, $value);
        if($distance === 0) {
            // Great, we got an exact match!
            return $value;
        }

        if($closest_match['distance'] === null || ($distance >= 0 && $distance < $closest_match['distance'])) {
            $closest_match['value'] = $value;
            $closest_match['distance'] = $distance;
        }
    }

    if($closest_match['distance'] === null || $closest_match['value'] === null || $closest_match['distance'] > $threshold) {
        return null;
    } 
    return $closest_match['value'];

}
/**
*返回最接近的Levenshtein匹配项
*@param字符串$input
*@param数组$correct_值
*@param int$阈值
*@return null |字符串最接近的匹配字符串或null
*/
公共函数getCloseMatch($input,$correct_values=array(),$threshold=2){
$closest_match=array('value'=>null,'distance'=>null);
foreach($将_值更正为$value){
$distance=levenshtein($input,$value);
如果($distance==0){
//太好了,我们找到了一个精确的匹配!
返回$value;
}
如果($distance>=0&$distance<$distance<$nestest_-match['distance']==null | | |($distance>=0&$distance<$distance['distance'])){
$closest_match['value']=$value;
$最近匹配['distance']=$距离;
}
}
如果($NESSEST|U match['distance']==null | |$NESSEST|U match['value']==null | |$NESSEST|U match['distance']>$阈值){
返回null;
} 
返回$closest_match['value'];
}

这就是该方法的基本用途。在您的用例中,您需要遍历
$correct\u values
中的每个条目,计算两个字符串之间的Levenshtein距离,并选择距离最小的一个(或者如果超过某个值,则不返回结果,例如2)


例如:

/**
 * Returns the closest Levenshtein match
 * @param string $input 
 * @param array $correct_values
 * @param int $threshold
 * @return null|string Either the closest-matching string or null
 */
public function getCloseMatch($input, $correct_values = array(), $threshold = 2) {
    $closest_match = array('value' => null, 'distance' => null);
    foreach($correct_values as $value) {
        $distance = levenshtein($input, $value);
        if($distance === 0) {
            // Great, we got an exact match!
            return $value;
        }

        if($closest_match['distance'] === null || ($distance >= 0 && $distance < $closest_match['distance'])) {
            $closest_match['value'] = $value;
            $closest_match['distance'] = $distance;
        }
    }

    if($closest_match['distance'] === null || $closest_match['value'] === null || $closest_match['distance'] > $threshold) {
        return null;
    } 
    return $closest_match['value'];

}
/**
*返回最接近的Levenshtein匹配项
*@param字符串$input
*@param数组$correct_值
*@param int$阈值
*@return null |字符串最接近的匹配字符串或null
*/
公共函数getCloseMatch($input,$correct_values=array(),$threshold=2){
$closest_match=array('value'=>null,'distance'=>null);
foreach($将_值更正为$value){
$distance=levenshtein($input,$value);
如果($distance==0){
//太好了,我们找到了一个精确的匹配!
返回$value;
}
如果($distance>=0&$distance<$distance<$nestest_-match['distance']==null | | |($distance>=0&$distance<$distance['distance'])){
$closest_match['value']=$value;
$最近匹配['distance']=$距离;
}
}
如果($NESSEST|U match['distance']==null | |$NESSEST|U match['value']==null | |$NESSEST|U match['distance']>$阈值){
返回null;
} 
返回$closest_match['value'];
}

查看-它会给你一个数字,告诉你需要在搜索词中更改多少字母才能匹配正确的值。然后,您可以用最小的汉明距离选择正确的值。

查看-它会给您一个数字,告诉您需要在搜索词中更改多少字母才能匹配正确的值。然后,您可以用最小的汉明距离选择正确的值。

这是一项非常艰巨的任务,不存在完美的解决方案。如果您对该语言有了解,那么可以看看php提供的声音函数。它们实际上可以用作一种“模糊搜索”。所以像
soundex()
这样的函数:这是一项非常艰巨的任务,不存在完美的解决方案。如果您对该语言有了解,那么可以看看php提供的声音函数。它们实际上可以用作一种“模糊搜索”。所以像
soundex()
这样的函数:太棒了!那正是我一直在寻找的。。我以前从未听说过这个,但我会马上深入研究@Dimser我很高兴它有用;我用一个例子更新了我的答案,这个例子传递了一个输入字符串、一个试图匹配的值数组和一个阈值限制(比如说,如果输入和数组之间的差异太大),作为一个示例Quick question。。在您的函数中-在
foreach
循环之前进行
if(在_数组($input,$correct_values))检查以排除任何不必要的处理,这是一个好主意吗?我相信如果($distance===0)
检查,它将返回与
相同的结果。@Dimser当然会,而且它会缩短一点过程(特别是如果在$correct\u值中有很多条目的话)。计算Levenshtein距离不是最便宜的计算(
O(len-n*len-m)
)太棒了!那正是我一直在寻找的。。我以前从未听说过这个,但我会马上深入研究@Dimser我很高兴它有用;我用一个例子更新了我的答案,这个例子传递了一个输入字符串、一个试图匹配的值数组和一个阈值限制(比如说,如果输入和数组之间的差异太大),作为一个示例Quick question。。在您的函数中-在
foreach
循环之前进行
if(在_数组($input,$correct_values))检查以排除任何不必要的处理,这是一个好主意吗?我相信如果($distance==0)
检查,它将返回与
相同的结果。@Dimser