所以,我正在为我的网站搜索表单。我遇到了路障。似乎其他人也有,但我一直无法找到我的问题的答案,至少有一个我理解的答案。
我在网上发现了一个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;
}
答案 0 :(得分:1)
您可以在order by
条款中进行任意数学运算,但您最有可能实际返回找到的距离,所以为什么不这样做
SELECT *, long_ugly_distance_calc_here AS distance
...
ORDER BY distance DESC