php ORDER BY子句按接近度排序

6jygbczu  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(135)

所以,我正在为我的网站设计一个搜索表单。我遇到路障了。似乎其他人也有,但我一直无法找到一个答案,我的问题,至少一个我理解。
我在网上找到一个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;
}
odopli94

odopli941#

您可以在order by子句中进行任意的数学运算,但是您最有可能实际返回找到的距离,那么为什么不这样做呢

SELECT *, long_ugly_distance_calc_here AS distance
...
ORDER BY distance DESC

相关问题