2

だから私はほとんどすべて(都市、州、郵便番号)を受け入れたい場所検索フィールドを持っています、例:

  • ロサンゼルス、カリフォルニア州
  • カリフォルニア
  • 90210
  • オレンジ CA

そして、それらの任意の組み合わせ...

それから、単語を配列に分割しました

$inputs = preg_split("/[\s,-\/]+/", $input);

それは私に次のようなものを与えます

array(5) {
    [0]=> string(4) "Some"
    [1]=> string(4) "City"
    [2]=> string(3) "New"
    [3]=> string(4) "York"
    [4]=> string(5) "88888"
}

次に、最初に郵便番号を選択します

foreach ($inputs as $key => $value) {

    if (is_numeric($value) && strlen($value) == 5) {

        $zip = $value;              
        unset($inputs[$key]);
    }
}

注意してくださいunset()

ここで、州名を州のデータベースと照合する必要があります。ジレンマは、一部の州では名前に複数の単語が含まれていることです (ノースカロライナ州、ニューヨーク州)。

州名と略語を一致させ、一致した条件を配列から削除するにはどうすればよい$inputsですか (次に、都市についても同じことを行う必要があります)。


しようと思ってた

$inputString = "'" . implode("','", $inputs) . "'";

$result = mysql_query("SELECT state_name
                      FROM states
                      WHERE state_name IN ({$inputString})
                      OR state_abbrev IN ({$inputString})");

しかし、それは一致したものや複数の単語の状態で機能するものはわかりません

編集:

嫌いな人には、3 つの個別のフィールドを持たないほうがいいと思います。これにより、ユーザーエクスペリエンスが複雑になると思います。彼らが伝えようとしている場所を最もよく推測するために、サーバーに彼らの代わりに考えさせたいと思います。これらのフィールドを含む「高度な」検索も行いますが、これらのフィールドはすべて、サイト デザインのスペースを占有しすぎます。

例:

4

4 に答える 4

2

address都市名、州名、郵便番号などの連結を含む列をテーブルに追加できます。次に、それにFULLTEXTインデックスを設定し、入力文字列全体の全文検索を実行します。

ただし、これがどれほどうまく機能するかはわかりません。

于 2012-06-28T22:01:28.333 に答える
0

これは私が現在使用しているものですが、ループやクエリが非常に多いため、効率的または非常に正確に「推測」できるとは思えません。

    function getLocations($input) {

    $state = NULL;
    $zip = NULL;

    $input = strtoupper(trim($input));

    $inputs = preg_split("/[^a-zA-Z0-9]+/", $input);

    // Resolve zip code
    foreach ($inputs as $key => $value) {

        if (is_numeric($value) && strlen($value) == 5) {

            $zip = $value;              
            unset($inputs[$key]);
        }
    }

    $inputs = array_reverse($inputs);

    $result = mysql_query("SELECT state_name, state_abbrev FROM states");

    // Resolve state (one worded)
    while ($row = mysql_fetch_assoc($result)) {

        foreach ($inputs as $key => $value) {

            if ($row['state_abbrev'] == $value || $row['state_name'] == $value) {

                $state = $row['state_abbrev'];
                unset($inputs[$key]);

                return array(
                    'city' => "'" . implode(" ", array_reverse($inputs)) . "'",
                    'state' => "'" . $state . "'",
                    'zip' => "'" . $zip . "'"
                );
            }
        }
    }

    // Resolve state (2/3 worded)
    for ($i = 0; $i < count($inputs) - 1; $i++) {

        $duoValue = @$inputs[$i + 1] . " " . @$inputs[$i];

        if (count($inputs) > $i + 2) {

            $trioValue = $inputs[$i + 2] . " " . $duoValue;
        }

        $result2 = mysql_query("SELECT state_name, state_abbrev FROM states") or die (mysql_error());

        while ($row = mysql_fetch_assoc($result2)) {

            if ($row['state_abbrev'] == $duoValue || $row['state_name'] == $duoValue) {

                $state = $row['state_abbrev'];
                unset($inputs[$i], $inputs[$i + 1]);

                return array(
                    'city' => "'" . implode(" ", array_reverse($inputs)) . "'",
                    'state' => "'" . $state . "'",
                    'zip' => "'" . $zip . "'"
                );
            }
            else if ($i < count($inputs) - 2) {

                if ($row['state_abbrev'] == $trioValue || $row['state_name'] == $trioValue) {

                    $state = $row['state_abbrev'];
                    unset($inputs[$i], $inputs[$i + 1], $inputs[$i + 2]);

                    return array(
                        'city' => "'" . implode(" ", array_reverse($inputs)) . "'",
                        'state' => "'" . $state . "'",
                        'zip' => "'" . $zip . "'"
                    );
                }
            }
        }
    }

    return array(
        'city' => "'" . implode(" ", array_reverse($inputs)) . "'",
        'state' => "'" . $state . "'",
        'zip' => "'" . $zip . "'"
    );
}
于 2012-06-28T22:25:50.990 に答える
0

考えられる解決策は、ユーザーに郵便番号を要求し、http://www.zippopotam.us/の api を使用して州と都市を取得することです。これがあなたの ux 設計に従っているかどうかはわかりませんが、私は'値を持つ2つのフィールドを返すAPIを使用してjqueryでこれを行いました

   $("#text-4edcd39ecca23").keyup(function (event) {
        if (this.value.length === 5) {
            var $citywrap = $("#fm-item-text-4edcd393cb50f");
            var $city = $("#text-4edcd38744891");
            var $statewrap = $("#fm-item-text-4edcd38744891");
            var $state = $("#text-4edcd393cb50f");
            var $zip = $('#text-4edcd39ecca23');

            $.ajax({
                url:"http://zippo-zippopotamus.dotcloud.com/us/" + $zip.val(),
                cache:false,
                dataType:"json",
                type:"GET",
                data:"us/" + $zip.val(),
                success:function (result, success) {
                    // Remove Error Message if one is presant
                    $zip.parent().find('small').remove();
                    // US Zip Code Records Officially Map to only 1 Primary Location
                    var places = result['places'][0];
                    $city.val(places['place name']);
                    $state.val(places['state']);
                    $citywrap.slideDown();
                    $statewrap.slideDown();
                },
                error:function (result, success) {
                    $citywrap.slideUp();
                    $statewrap.slideUp();
                    $city.val('');
                    $state.val('');
                    $zip.parent().find('br').remove();
                    $zip.parent().find('small').remove();
                    $zip.after('<br /><small class="error">Sorry your zipcode was not reconized please try again</small>');
                }
            });
        }
    });
于 2012-06-29T00:24:23.840 に答える
0

ユーザーにとって使いやすく、すべての住所情報を 1 つの入力ボックスにまとめるというあなたの考えに完全に同意します。ただし、各ユーザーが入力する情報は多少異なる場合があり、すべてのケースをカバーするアルゴリズムを考え出すことは非常に困難です。最善の策は、誰かがすでにこれを行っているかどうかを確認することです。あなたが言及したように、Google は行っています。幸いなことに、彼らはまさにそのような問題のための API を持っています。

Google マップ ジオコーダー ( https://developers.google.com/maps/documentation/geocoding/#GeocodingRequests ) を使用する場合、基本的に住所のように見えるものなら何でも渡すことができ、よく構造化された住所が返されます。結果。

Google の例: https://google-developers.appspot.com/maps/documentation/javascript/examples/geocoding-simple

別の例 - 白い家を調べる: 次の URL をブラウザに入力します: http://maps.googleapis.com/maps/api/geocode/json?address=1600%20pennsylvania%20ave%20washongton%20dc&sensor=false (注API の許容範囲を示すために、ここでは意図的にスペルを間違えています)。

API 呼び出しは非常に便利な JSON オブジェクトを返します。

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Pennsylvania Ave NW",
               "short_name" : "Pennsylvania Ave NW",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Washington",
               "short_name" : "Washington",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "District of Columbia",
               "short_name" : "DC",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "20502",
               "short_name" : "20502",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Pennsylvania Ave NW, Washington, DC 20502, USA",
         "geometry" : {
            "location" : {
               "lat" : 38.89767770,
               "lng" : -77.03651700000002
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 38.89902668029149,
                  "lng" : -77.03516801970852
               },
               "southwest" : {
                  "lat" : 38.89632871970850,
                  "lng" : -77.03786598029153
               }
            }
         },
         "partial_match" : true,
         "types" : [ "street_address" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Pennsylvania Ave NW",
               "short_name" : "Pennsylvania Ave NW",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Washington",
               "short_name" : "Washington",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "District of Columbia",
               "short_name" : "DC",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "20500",
               "short_name" : "20500",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Pennsylvania Ave NW, Washington, DC 20500, USA",
         "geometry" : {
            "location" : {
               "lat" : 38.89871490,
               "lng" : -77.03765550
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 38.90006388029150,
                  "lng" : -77.03630651970849
               },
               "southwest" : {
                  "lat" : 38.89736591970851,
                  "lng" : -77.03900448029150
               }
            }
         },
         "partial_match" : true,
         "types" : [ "street_address" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Pennsylvania Ave NW",
               "short_name" : "Pennsylvania Ave NW",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Washington",
               "short_name" : "Washington",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "District of Columbia",
               "short_name" : "DC",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "20004",
               "short_name" : "20004",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Pennsylvania Ave NW, Washington, DC 20004, USA",
         "geometry" : {
            "location" : {
               "lat" : 38.89549710,
               "lng" : -77.03008090000002
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 38.89684608029150,
                  "lng" : -77.02873191970852
               },
               "southwest" : {
                  "lat" : 38.89414811970850,
                  "lng" : -77.03142988029153
               }
            }
         },
         "partial_match" : true,
         "types" : [ "street_address" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Pennsylvania Ave SE",
               "short_name" : "Pennsylvania Ave SE",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Hill East",
               "short_name" : "Hill East",
               "types" : [ "neighborhood", "political" ]
            },
            {
               "long_name" : "Washington",
               "short_name" : "Washington",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "District of Columbia",
               "short_name" : "DC",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "20003",
               "short_name" : "20003",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Pennsylvania Ave SE, Washington, DC 20003, USA",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 38.87865290,
                  "lng" : -76.98170180
               },
               "southwest" : {
                  "lat" : 38.87865220,
                  "lng" : -76.98170229999999
               }
            },
            "location" : {
               "lat" : 38.87865290,
               "lng" : -76.98170180
            },
            "location_type" : "RANGE_INTERPOLATED",
            "viewport" : {
               "northeast" : {
                  "lat" : 38.88000153029150,
                  "lng" : -76.98035306970850
               },
               "southwest" : {
                  "lat" : 38.87730356970850,
                  "lng" : -76.98305103029151
               }
            }
         },
         "partial_match" : true,
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}    
于 2012-06-29T00:04:47.733 に答える