0

我已经在模型中编写了这些函数(我正在使用 CodeIgniter)。

    function getLocalIngrdname()
{
    $this->load->database();
    $query = $this->db->get('onl_local_ingrd');
    foreach($query->result() as $row)
        $allingrd[]=$row->ingrd_localname;
    return $allingrd;
}

    function getCloseIngrdname($ingrdname,$localname)
{
    $this->load->database();
    $query = $this->db->get('onl_ingrd');
    foreach($query->result() as $row)
        $allingrd[]=$row->ingrd_name;

    foreach($localname as $row)
        $allingrd[]=$row;

            $shortest=-1;
            foreach ($allingrd as $ingrd) {
        $lev = levenshtein($ingrdname, $ingrd);
        if ($lev <= $shortest || $shortest < 0) {
            $closeword  = $ingrd;
            $shortest = $lev;

        }
    }
        return $closeword;
   }

此功能在控制器中

   函数获取结果()
   {
    $this->load->model('searchRecipe_model');
    $ingrdname = $this->input->post('ingrdname');
    $输出[]=2;
    $localnames[]=$this->searchRecipe_model->getLocalIngrdname();
    $output[]=$this->searchRecipe_model->getCloseIngrdname($ingrdname,$localnames);
    回声 json_encode($localnames);
  }

$allingrd是一组成分名称。我$closeword在 javascript 中显示警报消息。如果我给$lev=levenshtein($ingrdname,$allingrd[0])它完美的工作;但是,它不在循环中工作。关于为什么的任何想法?提前致谢。

4

3 回答 3

1

也许你有一些超过 255 个字符的字符串?在这些情况下,levenshtein() 函数返回 -1,这意味着根据您的算法,最后一个这样的字符串将始终是“最短的”。如果这是您的问题,您需要以这种方式丢弃 $lev 等于 -1 的值:

foreach ($allingrd as $ingrd) {
        $lev = levenshtein($ingrdname, $ingrd);
        if (($lev <= $shortest || $shortest < 0) && $lev != -1) {
            $closeword  = $ingrd;
            $shortest = $lev;

        }
}
return $closeword;

请注意,$closeword 可能并不总是被设置(例如,如果 $allingrd 中的所有字符串都长于 255 个字符,或者如果 $allingrd 为空)。不要忘记在循环之前将 $closeword 初始化为合理的值,例如 false、null 或空字符串。

于 2011-05-04T14:53:54.250 回答
0

请注意它们在 PHP 的levenshtein页面上如何声明$shortest-1. 这非常重要,否则您将永远无法满足if声明的要求。

$shortest = -1;
foreach ($allingrd as $ingrd) {
        $lev = levenshtein($ingrdname, $ingrd);
        if ($lev <= $shortest || $shortest < 0) {
            $closeword  = $ingrd;
            $shortest = $lev;

        }
}
return $closeword;

这应该可以解决问题。

于 2011-05-04T14:54:20.367 回答
0

我认为你想要做的是:

foreach ($allingrd as $ingrd) {
        $lev = levenshtein($ingrdname, $ingrd);
        if ($lev <= $shortest || $shortest < 0) {
            $closeword[] = $ingrd;
            $shortest[] = $lev;

        }
}
return $closeword;

现在 $closeword 是一个数组。您只是在每次循环运行时重新声明 $closeword 的值。现在,您将把值扔到一个数组中。$shortest 也是如此。

于 2011-05-04T14:49:19.077 回答