2016-07-30 24 views
0

升序有4份的代码:PHP - json_encode显示它通过元件从阵列

  1. 获取电影院的位置从数据库
  2. 获取距离在KM用户位置和电影院
  3. 之间添加距离进入阵列
  4. 显示这一切在JSON

所以距离不是东西,是在数据库中。

我只需要得到5个结果并按升序对它们进行排序,以便最近的位置将首先显示。

代码:

$result = mysqli_query($con,"query to get cinemaname,id,latitude,longitude,cinema logo"); 

$x = 1; 
while(($rowm = mysqli_fetch_array($result)) && ($x <= 5)) 
{ 

$lat1 = $_GET['lat'];//users location 
$lon1= $_GET['lon'];//users location 
$lat2 = $rowm['latitude']; //location of cinema in database 
$lon2 = $rowm['longitude']; //location of cinema in database 

//calculating the distance by two locations 

    $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 = $miles * 1.609344; 

$distance = substr($unit,0,4)." km"; 



$rowm['distance'] = $distance; //adding the distance into the array to show it in json 

$asd[]= $rowm; 

$x++; //loop to show it only 5 times 
} 

$alldata = array('items'=>$asd); //need to show first items to pass it to javascript 

header('Content-Type: application/json; charset=utf-8'); 
    echo json_encode($alldata); 
} 
?> 

结果:

{"items":[ 

{"cinemaname":"Cinema name","logo":"upload/logo.png","latitude":"25.2326052","longitude":"55.40300690000004","distance":"29.7 km"}, 

{"cinemaname":"Cinema name 2","logo":"upload/logo2.png","latitude":"25.2226052","longitude":"55.10300690000004","distance":"19.7 km"}, 

{"cinemaname":"Cinema name 3","logo":"upload/logo3.png","latitude":"25.2226052","longitude":"55.40200690000004","distance":"6.7 km"}, 

{"cinemaname":"Cinema name 4","logo":"upload/logo4.png","latitude":"25.2226052","longitude":"55.40200690000004","distance":"4.7 km"}, 

{"cinemaname":"Cinema name 5","logo":"upload/logo5.png","latitude":"25.2226052","longitude":"55.40200690000004","distance":"5.7 km"} 
]} 

需要以这种方式显示:

{"items":[ 
     {"cinemaname":"Cinema name 4","logo":"upload/logo4.png","latitude":"25.2226052","longitude":"55.40200690000004","distance":"4.7 km"}, 

    {"cinemaname":"Cinema name 5","logo":"upload/logo5.png","latitude":"25.2226052","longitude":"55.40200690000004","distance":"5.7 km"}, 

    {"cinemaname":"Cinema name 3","logo":"upload/logo3.png","latitude":"25.2226052","longitude":"55.40200690000004","distance":"6.7 km"}, 

{"cinemaname":"Cinema name 2","logo":"upload/logo2.png","latitude":"25.2226052","longitude":"55.10300690000004","distance":"19.7 km"}, 


    {"cinemaname":"Cinema name","logo":"upload/logo.png","latitude":"25.2326052","longitude":"55.40300690000004","distance":"29.7 km"} 

    ]} 

使最小距离将首先显示。

回答

0

您可以使用usort这样的:

usort($asd, function($a, $b) { 
    if($a['distance'] === $b['distance']) return 0; 
    return floatval ($a['distance']) - floatval ($b['distance']) < 0 ? -1 : 1; 
}); 
+0

谢谢回答,几乎是正确的,但仍显示数据点点例如不正确显示1,2,4,3,5,6,8,7,9其中一些显示不正确。 –

+0

请尝试更新的答案是铸造问题。 –

+0

真棒伊斯梅尔,运作良好,但现在有另一个问题,如果你可以帮我解决..目前它显示随机5个位置和距离。现在,我只需要得到3个结果。这可能吗?非常感谢你,你是一个很好的人。 –

0

你可以尝试GLength功能在MySQL:

SELECT 
    *, GLength(LineString(GeomFromText('POINT(latUser,lngUser)'),GeomFromText('POINT(latCinema,lngCinema)'),))*100 AS DISTANCE 
FROM cinema   
ORDER BY DISTANCE LIMIT 5