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;
   }

この関数はコントローラにあります

   関数 getResult()
   {
    $this->load->model('searchRecipe_model');
    $ingrdname = $this->input->post('ingrdname');
    $output[]=2;
    $localnames[]=$this->searchRecipe_model->getLocalIngrdname();
    $output[]=$this->searchRecipe_model->getCloseIngrdname($ingrdname,$localnames);
    echo json_encode($localnames);
  }

$allingrd成分名の配列です。$closewordin javascript アラート メッセージを表示します。私が与えると、$lev=levenshtein($ingrdname,$allingrd[0])それは完全に機能します。ただし、ループ内では機能しません。理由についてのアイデアはありますか?前もって感謝します。

4

3 に答える 3

1

たぶんあなたは255文字より長いsom文字列を持っていますか?このような場合、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のレーベンシュタインページで彼らがどのように宣言$shortestしているかに注目してください-1ifこれは非常に重要です。さもないと、ステートメントの要件を満たせなくなります。

$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 に答える