【问题标题】:PHP - output result in ascending order of while() loopPHP - 以while()循环的升序输出结果
【发布时间】:2023-03-04 14:51:02
【问题描述】:

我需要根据循环内的计算显示结果。循环的结果应该是 $distance 的升序。

    $sql = "SELECT DISTINCT * FROM cinemas WHERE city='$city'";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {

        while($row = $result->fetch_assoc()) {



    $lat1 = $_GET['lat'];
    $lon1= $_GET['lon'];
    $lat2 = $row['latitude'];
    $lon2 = $row['longitude'];

    //starting calculating the distance

      $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);
echo $row['cinemaname'].$distance;

}}

如何根据 $distance 升序显示结果?

显示为:

cinema name 20 km
cinema name 5 km
cinema name 30 km
cinema name 3 km

我需要在:

cinema name 3 km
cinema name 5 km
cinema name 20 km
cinema name 30 km

【问题讨论】:

  • 将值保存在一个数组中,然后对数组进行排序
  • 感谢您的评论,但我不知道该怎么做

标签: php mysql loops while-loop


【解决方案1】:

将 while 中的返回值保存在这样的数组中:

$cinema[$i]['cinemaname'] = $row['cinemaname'];
$cinema[$i]['distance'] = $distance;

并在此之后制作:

function sortByOrder($a, $b) {
    return $a['distance'] - $b['distance'];
}

usort($cinema, 'sortByOrder');

现在你有你的订单:)

这是你的代码:

$sql = "SELECT DISTINCT * FROM cinemas WHERE city='$city'";

$result = $conn->query($sql);
$cinema = array();
$i = 0;
if ($result->num_rows > 0) {

    while($row = $result->fetch_assoc()) {
       $lat1 = $_GET['lat'];
       $lon1= $_GET['lon'];
       $lat2 = $row['latitude'];
       $lon2 = $row['longitude'];

       //starting calculating the distance

       $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);
       $cinema[$i]['cinemaname'] = $row['cinemaname'];
       $cinema[$i]['distance'] = $distance;
       $i++;
    }
}

function sortByOrder($a, $b) {
   return $a['distance'] - $b['distance'];
}

usort($cinema, 'sortByOrder');

【讨论】:

  • 感谢您的回答,但显示空白页面。我应该在这里回应什么?当我将 echo 写到 $cinema[$i]['distance'] 时,它显示我不是按升序排列...
  • 在 usort 之后 print_r($cinema) 的输出是什么?
  • Array ( [0] => Array ( [cinemaname] => 44 [distance] => 2.00 ) [1] => Array ( [cinemaname] => 43 [distance] => 2.34 ) [2] => Array ( [cinemaname] => 47 [distance] => 5.61 ) [3] => Array ( [cinemaname] => 41 [distance] => 6.08 ) [4] => Array ( [cinem...
  • 我需要在循环内部而不是外部回显它/打印它。
  • usort 和 print_r($cinema) 应该出现在循环内,因为电影院的名称在里面,但距离现在在外面
【解决方案2】:
    $sql = "SELECT DISTINCT * FROM cinemas WHERE city='$city'";



       $result = $conn->query($sql);
    $distanceArray=array('');
$i=0;
        if ($result->num_rows > 0) {

        while($row = $result->fetch_assoc()) {



    $lat1 = $_GET['lat'];
    $lon1= $_GET['lon'];
    $lat2 = $row['latitude'];
    $lon2 = $row['longitude'];

    //starting calculating the distance

      $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);
    $distanceArray[$i]=$row['cinemaname'].$distance;
$i++;
}}
sort($distanceArray);
foreach($distanceArray as $nameDistance)
{
echo $nameDistance; echo '<br>';
}

【讨论】:

  • 谢谢Anish,但是如果我有两个循环呢? while 循环内部的一个 while 循环,因为从两个表中有两个选择...
  • 有3个表:$sql = "SELECT DISTINCT cinemaname,id FROM cinemas WHERE city='$city' "; $sql2 = "SELECT DISTINCT cinemaname,id,logo FROM cinema WHERE id = '$cinemaname'"; $sql3 = "SELECT DISTINCT * FROM moviecinemashowsassociation WHERE cinemaid = '$cinemaid' AND movieid='$movieid' AND showdate='$today' ";
  • 在两个诡计循环之间插入代码,并将数组取出$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); $distanceArray[$i]=$row['cinemaname'].$distance;
  • 但是有 3 个循环...请告诉我如何联系您?您的代码有效,但仍处于 3 个循环中,我对如何使用它感到困惑......
  • 你在while循环中插入需要的条件while( ){while( ){while( ){ $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); $distanceArray[$i]=$row['cinemaname'].$distance; }}}
【解决方案3】:

您也可以编写一个 MySQL 函数来计算距离,然后按升序查询。 像这样:

$sql = "SELECT DISTINCT *, distance($lat1,$lon1) AS dist  FROM cinemas WHERE city='$city' ORDER BY dist ASC";

当然要事先写好对应的MySQL函数。

【讨论】:

猜你喜欢
  • 2012-01-02
  • 2016-03-20
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多