Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php页面中的Sql排序_Php_Sql_Json_Sorting - Fatal编程技术网

php页面中的Sql排序

php页面中的Sql排序,php,sql,json,sorting,Php,Sql,Json,Sorting,您好,我正在寻找有关在特定排序中排序数据的帮助或以下指南: 我有一个表,包含两个索引纬度和经度,另一方面在网页内我有一个纬度和经度: 我做这个查询是为了从表中得到所有的lat和long,在这里我停止了,我有一个函数来进行计算 function distance() { $lat1= 36.2048; $lang1= 138.2529; $query = "select * from locations"; $var = $con->query($query); while($row_in

您好,我正在寻找有关在特定排序中排序数据的帮助或以下指南:

我有一个表,包含两个索引纬度和经度,另一方面在网页内我有一个纬度和经度:

我做这个查询是为了从表中得到所有的lat和long,在这里我停止了,我有一个函数来进行计算

function distance() {

$lat1= 36.2048;
$lang1= 138.2529;
$query = "select * from locations";
$var = $con->query($query);
while($row_info = $var->fetch()){

  $lat2= $row_info['lat'];
  $lang= $row_info['long'];
    if(($lat1 == $lat2) && ($lon1 == $lon2)) {
        return 0;
    } else {
        $theta = $lon1 - $lon2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist);
        $miles = $dist * 60 * 1.1515;
        $unit = strtoupper($unit);

        if ($unit == "K") {
            return ($miles * 1.609344);
        } else if ($unit == "N") {
            return ($miles * 0.8684);
        } else {
            return $miles;
        }
    }
}}

我需要做一个计算,将我从查询中获得的lat和long与网页中现有的lat和long进行比较,并命令它们Desc在新查询中再次获得它们

编辑:下面是一个如何直接使用查询进行距离计算(以英里为单位)的示例:

$lat1= 36.2048;
$lang1= 138.2529;
$query = "select * from locations";

$query = 'SELECT *, CASE
    WHEN '. $lat1 .' = `lat` && '. $lang1 .' = `long` THEN
        0
    ELSE
        DEGREES(ACOS(
            SIN(RADIANS(`lat`)) * SIN(RADIANS('. $lat1 .')) +
            COS(RADIANS(`lat`)) * COS(RADIANS('. $lat1 .')) * COS(RADIANS(`long`-'. $lang1 .'))
            ))
        * 69.09
    END as distance
FROM `locations`
ORDER BY distance desc';
旧答案:

您可以使用
usort
()

下面是一个例子:

//global lat / lan from page
$lat = 46.945252; 
$lon = 7.424627;

//query results
$data = [
    ['name'=>'coords1','lat'=>47.348121, 'lon'=>7.903737],
    ['name'=>'coords2','lat'=>47.378104, 'lon'=>8.536811]
];

usort($data,function($a,$b) {
    global $lat, $lon;
    $distA = distance($a['lat'],$a['lon'],$lat,$lon,'K');
    $distB = distance($b['lat'],$b['lon'],$lat,$lon,'K');
    if ($distA > $distB) {
        return -1;
    } else if ($distA < $distB) {
        return 1;
    }
    return 0;
});

//now $data is sorted according to distance (desc)
//第页的全局lat/lan
$lat=46.945252;
$lon=7.424627;
//查询结果
$data=[
['name'=>coords1','lat'=>47.348121,'lon'=>7.903737],
['name'=>coords2','lat'=>47.378104,'lon'=>8.536811]
];
usort($data,function($a,$b){
全球$lat,$lon;
$distA=距离($a['lat'],$a['lon'],$lat,$lon,'K');
$distB=距离($b['lat'],$b['lon'],$lat,$lon,'K');
如果($distA>$distB){
返回-1;
}否则如果($distA<$distB){
返回1;
}
返回0;
});
//现在,$数据按距离(desc)排序

通常,对数据进行排序的最佳位置是作为查询的一部分,使用
orderby
。你能给我们看一下这个查询吗?你也可以把所有这些计算作为query@RiggsFolly请告诉我们你的问题,我们可以做出合理准确的建议。好的,我会尽力对这个问题做进一步的解释。谢谢你这么快就回答了,所以我明白你希望我这么做在数组中插入查询结果,并对每个结果进行计算,但之后需要使用[id,calculation result]对结果进行汇总,以便我可以通过新查询从同一原始数据中获取更多信息。对,如果您必须通过新查询获取更多信息,最好将计算部分也转移到查询中-您是否有一些数据的示例以及关于您必须获得的进一步信息的一些信息?编辑问题,谢谢你的关注。我添加了一个exmaple如何在查询中进行计算-现在的问题是你想对结果做什么-如果是另一个查询,也可以在这个查询中进行计算