2016-07-30 33 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