所以,我正在为我的网站设计一个搜索表单。我遇到路障了。似乎其他人也有,但我一直无法找到一个答案,我的问题,至少一个我理解。
我在网上找到一个PHP函数,它可以抓取指定半径内的所有邮政编码。我编辑了sql查询,这样我就不会获取该半径内的每个邮政编码,而是获取与用户帐户相关联的邮政编码。该功能的工作,并抓住邮政编码后,我。此函数返回一个包含邮政编码的数组。我想把邮政编码按距离从最近到最远排序,显然我没有足够的智慧来弄清楚如何做到这一点。
我尝试过的:
我找到了另一个PHP函数,可以计算两组坐标(lat,lon2,lat2,lon2)之间的距离。我创建了自己的函数,该函数循环遍历邮政编码数组,并通过calculateDistance函数运行每个zip。只是看起来一团糟。我相信我有所有的碎片,只是不知道如何把这一切放在一起。任何帮助将不胜感激。
下面是我正在使用的zipcodeRadius函数:
// get all the zipcodes within the specified radius - default 20
function zipcodeRadius($lat, $lon, $radius)
{
$radius = $radius ? $radius : 20;
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$sql = 'SELECT DISTINCT zipcodes.ZIP,
members.*,
location.*
FROM members
LEFT JOIN location ON members.id = location.user_id
LEFT JOIN zipcodes ON location.zip = zipcodes.ZIP
WHERE activated="1"
AND (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) <= '.$radius.';';
$result = mysqli_query($dbc, $sql);
// get each result
$zipcodeList = array();
while($row = mysqli_fetch_array($result))
{
array_push($zipcodeList, $row['ZIP']);
}
return $zipcodeList;
}
下面是calculateDistance函数
function calculateDistance($latitude1, $longitude1, $latitude2, $longitude2) {
$theta = $longitude1 - $longitude2;
$miles = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$miles = acos($miles);
$miles = rad2deg($miles);
$miles = $miles * 60 * 1.1515;
return $miles;
}
这是我的看似无用的功能:
$matches = join(',',$zipCodeArray);
function sort_zip_by_distance($matches, $lat, $lon){
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$queryDistance = "SELECT * FROM zipcodes WHERE ZIP IN ($matches)";
$resultDistance = mysqli_query($dbc, $queryDistance) or die("Unable to query the database");
while($rowDistance = mysqli_fetch_array($resultDistance)){
$miles = calculateDistance($lat, $lon, $rowDistance['Latitude'], $rowDistance['Longitude']);
echo '<p>ZIP: ' . $rowDistance['ZIP'] . ' | Lat: ' . $rowDistance['Latitude'] . ' | Lon: ' . $rowDistance['Longitude'] . ' | Miles: ' . $miles . '</p><br />';
$distanceTotal = array();
array_push($distanceTotal, $rowDistance['ZIP'], $miles);
}
return $distanceTotal;
}
1条答案
按热度按时间odopli941#
您可以在
order by
子句中进行任意的数学运算,但是您最有可能实际返回找到的距离,那么为什么不这样做呢