私のphpアプリケーションでは、指定された郵便番号に最も近い郵便番号を取得したいと思います。つまり680721
、データベースからこれに最も近い郵便番号を取得したいので、郵便番号を入力します。
これどうやってするの?
これは私が郵便番号を保管するために使用したテーブルです。
これvarpin
が郵便番号フィールドです。
私のphpアプリケーションでは、指定された郵便番号に最も近い郵便番号を取得したいと思います。つまり680721
、データベースからこれに最も近い郵便番号を取得したいので、郵便番号を入力します。
これどうやってするの?
これは私が郵便番号を保管するために使用したテーブルです。
これvarpin
が郵便番号フィールドです。
以上のことをすべて述べた上で、UK Postcodes Wikipediaエントリの「ExternalLinks」をざっと見てみると、PaulJenkinsによる「UKPostCode Distance Calculation in PHP」というタイトルの記事がすぐに見つかりました。これは、ここからダウンロードすることもできます( uk_postcode_calc.zip)。簡単な調査の後、これは缶に書かれていることを正確に実行し、距離を計算するだけのようです。ただし、php距離計算用のクイックグーグルを使用すると、距離計算に相当するより洗練されたものがあることがすぐにわかります。代わりにそれらの1つを使用するのは良い考えかもしれないと思いました。少し調整した後、最終的に思いついたのは次のとおりです。
function distance($lat1, $lon1, $lat2, $lon2, $u=’1′) {
$u=strtolower($u);
if ($u == ‘k’) { $u=1.609344; } // kilometers
elseif ($u == ‘n’) { $u=0.8684; } // nautical miles
elseif ($u == ‘m’) { $u=1; } // statute miles (default)
$d=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($lon1-$lon2));
$d=rad2deg(acos($d));
$d=$d*60*1.1515;
$d=($d*$u); // apply unit
$d=round($d); // optional
return $d;
}
これが難しい部分(データベースと数学)です。次は、この情報を使用して、入力した郵便番号から提供する郵便番号の配列に「最も近い」郵便番号を見つける場合です。「最も近い」郵便番号を効果的に見つけるには私たちがやろうとしているのは、郵便番号間の「最短」距離、つまり、キーを郵便番号、距離を値として結果を配列に入れたと仮定して、結果の最小数を見つけることです。私たちがしなければならないのは、与えられた配列の中で最小の数を見つけて、適切なキーを返す簡単なスクリプトを作成することです。単純!
function closest ($needle,$haystack) {
if (!$needle || !$haystack) { return; }
if (!is_array($haystack)) { return; }
$smallest=min($haystack); //smallest value
foreach ($haystack as $key => $val) {
if ($val == $smallest) { return $key; }
}
}
上記のスクリプトは、必要なことを正確に実行します。「min」関数を使用すると、返す必要のあるものをすばやく見つけることができます。残っている唯一のタスクは、これらすべてをバインドすることです。次の2つの関数を作成する必要があります。郵便番号を使用して距離を取得し、データベースから経度と緯度を取得します。郵便番号をキーとして、距離を値として配列を作成します。とてもシンプル!関数1、郵便番号の距離
function postcode_distance ($from,$to) {
// Settings for if you have a different database structure
$table=’postcodes_uk’;
$lat=’lat’;
$lon=’lon’;
$postcode=’postcode’;
// This is a check to ensure we have a database connection
if (!@mysql_query(‘SELECT 0′)) { return; }
// Simple regex to grab the first part of the postcode
preg_match(‘/[A-Z]{1,2}[0-9R][0-9A-Z]?/’,strtoupper($from),$match);
$one=$match[0];
preg_match(‘/[A-Z]{1,2}[0-9R][0-9A-Z]?/’,strtoupper($to),$match);
$two=$match[0];
$sql = “SELECT `$lat`, `$lon` FROM `$table` WHERE `$postcode`=’$one’”;
$query = mysql_query($sql);
$one = mysql_fetch_row($query);
$sql = “SELECT `$lat`, `$lon` FROM `$table` WHERE `$postcode`=’$two’”;
$query = mysql_query($sql);
$two = mysql_fetch_row($query);
$distance = distance($one[0], $one[1], $two[0], $two[1]);
// For debug only…
//echo “The distance between postcode: $from and postcode: $to is $distance miles\n”;
return $distance;
}
Function 2, Postcode Closest
function postcode_closest ($needle,$haystack) {
if (!$needle || !$haystack) { return; }
if (!is_array($haystack)) { return; }
foreach ($haystack as $postcode) {
$results[$postcode]=postcode_distance($needle,$postcode);
}
return closest($needle,$results);
}
それで、それが終わったら、上記の4つの関数を「postcode.php」などのファイルに配置して、実際の世界で使用できるようにします。テストケース:
<?php
include_once(‘postcode.php’);
if ($_POST) {
include_once(‘db.php’);
$postcodes=array(‘TF9 9BA’,'ST4 3NP’);
$input=strtoupper($_POST['postcode']);
$closest=postcode_closest($input,$postcodes);
}
if (isset($closest)) {
echo “The closest postcode is: $closest”;
}
?>
<form action=”" method=”post”>
Postcode: <input name=”postcode” maxlength=”9″ /><br />
<input type=”submit” />
</form>
このスクリプトは次の場所からダウンロードできます。postcode_search.phps注:上記のテストケースでは、データベースの詳細を含み、データベース接続を開始する「db.php」ファイルがあります。同じことをすることをお勧めします。データベースにデータが入力されていることを確認してください。PaulJenkinsのUKPostcodecsvを使用できるようになり、独自のテーブル構造を使用できるようになります。これですべてです。このスクリプトを使用して、「最も近い」郵便番号に一致する場所を指定できます。