2016-06-13 21 views
0

まず、私は開発には新しく、少し手を持たせる必要があります。(PHP)ユーザ検索と配列のマッチング

私は単純な検索フィールド(提案付き)を構築し、配列一致の関連するランディングページにユーザーを送りました。検索が適切でない場合は、エラーメッセージを返します。しかし、私のコードは、ユーザーが提案をクリックしたり、検索フィールドに単語全体を入力することに依存しています。したがって、使い勝手が悪いです。

以下のコードは私の問題を際立たせます。理想的には、フィールド入力 'br'を 'bristol'に一致させる必要があります(ユーザーに提案したとおり)。私は解決策がhttp://php.net/manual/en/function.levenshtein.phpだと思うが、私は問題を実装している(私が言ったように、私は新しい)。私はどんな指導にも感謝します。

お時間をいただきありがとうございます!

<?php 

$counties = array("Avon", 
"Bristol", 
"Bedfordshire", 
"Berkshire", 
"Buckinghamshire" 
); 

if (in_array(strtolower($_GET["my_input"]), array_map('strtolower', $counties))) 

{ header('Location: http://domain.co.uk/county/'.strtolower(str_replace(' ', '-', $_GET['my_input']))); 
} 

else 

{ 
header('Location: ' . $_SERVER['HTTP_REFERER'] . "?message=tryagain"); 
exit; 
} 

?> 

答えて

0

は、最適化されたが、一般的に次のようになります。

foreach(array_map('strtolower', $counties) as $county) { 
    if(substr($county, 0, strlen($_GET["my_input"])) == strtolower($_GET["my_input"])) { 
     header('Location: http://domain.co.uk/county/'.str_replace(' ', '-', $county)); 
     exit; 
    } 
} 
header('Location: ' . $_SERVER['HTTP_REFERER'] . "?message=tryagain"); 
exit; 
  • ループ$counties$_GET["my_input"]を比較同じ開始文字数を$county
  • ユーザーは Beその後、 Bedfordshireが最初のエントリであることが選択されます入ると3210
  • $_GET["my_input"]明らか

ヘッダに$countyを使用してくださいとではありません。あなたの "提案"が同じ順序である限り、それはうまく動作するはずです。

場合、ユーザーは多分trim()、末尾のスペースまたは何かを入力:

if(substr($county, 0, strlen(trim($_GET["my_input"]))) == strtolower(trim($_GET["my_input"]))) { 
+0

完璧!トリム要素がコードを破るように見えましたが、私はそれをさらに調べます。ユーザーは、私のコードが半分になって、ユーザーが失われているという少数の文字を入力するのに慣れています。しかし、これはトリックを行っています。ありがとうございました! –

0

これはあなたの目標にあなたが近づく(いない場合)を取得する必要があります

if(array_key_exists('my_input', $_GET){ 

    $input = $_GET["my_input"]; 
    $counties = array("Avon", "Bristol", "Bedfordshire", "Berkshire", "Buckinghamshire"); 

    // no shortest distance found, yet 
    $shortest = -1; 

    // loop through words to find the closest 
    foreach ($counties as $country) { 

     $lev = levenshtein($input, $country); 

     // check for an exact match 
     if ($lev == 0) { 
      $closest = $country; 
      $shortest = 0; 
      // break out of the loop; we've found an exact match 
      break; 
    } 

     // if this distance is less than the next found shortest 
     // distance, OR if a next shortest word has not yet been found 
     if ($lev <= $shortest || $shortest < 0) { 
      // set the closest match, and shortest distance 
      $closest = $country; 
      $shortest = $lev; 
     } 
    } 

    if($shortest < 5){ //insert your own value here (accuracy) 
     header('Location: http://domain.co.uk/county/'.strtolower($closest)); 
    }else{  
     // if not match 
     header('Location: ' . $_SERVER['HTTP_REFERER'] . "?message=tryagain"); 
    } 

} 
0

あなたがstartsWith function from this answerを使用して、一致が見つかった場合にはフラグを設定し、あなたの郡を反復処理することができます。次のようになりますあなたのコードのためのレーベンシュタイン実装

<?php 

function startsWith($haystack, $needle) { 
    // search backwards starting from haystack length characters from the end 
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false; 
} 

$counties = array("Avon", 
"Bristol", 
"Bedfordshire", 
"Berkshire", 
"Buckinghamshire" 
); 

foreach (array_map('strtolower', $counties) as $county){ 
    if(startsWith($county, strtolower($_GET["my_input"]))){ 
    header('Location: http://domain.co.uk/county/'.strtolower(str_replace(' ', '-', $_GET['my_input']))); 
    $match = true; 
    break; 
    } 
} 

if(empty($match)) 
    header('Location: ' . $_SERVER['HTTP_REFERER'] . "?message=tryagain"); 
0

$counties = array(
    "Avon", 
    "Bristol", 
    "Bedfordshire", 
    "Berkshire", 
    "Buckinghamshire" 
); 

$input = 'Bed'; 
$shortest = -1; 

foreach($counties as $county) { 

    $lev = levenshtein($input, $county); 
    var_dump($county, $lev); 

    if ($lev == 0) { 
     $closest = $county; 
     break; 
    } 

    if ($lev <= $shortest || $shortest < 0) { 
     $closest = $county; 
     $shortest = $lev; 
    } 

} 

echo $closest; 

しかし、私は、これはあなたが技術的にAvonが使用BedfordshireよりBedに近いので、探している正確に何をするとは思いませんこのアルゴリズム。

PHPには、より良い結果をもたらすかもしれないsimilar_text関数があります。

$counties = array(
    "Avon", 
    "Bristol", 
    "Bedfordshire", 
    "Berkshire", 
    "Buckinghamshire" 
); 

$input = 'Bed'; 
$mostSimilar = 0; 

foreach($counties as $county) { 

    similar_text($input, $county, $similarity); 

    if ($similarity == 100) { 
     $closest = $county; 
     break; 
    } 

    if ($mostSimilar <= $similarity || $similarity < 0) { 
     $closest = $county; 
     $mostSimilar = $similarity; 
    } 

} 

echo $closest;