PHP排序数组结果从值开始下降

时间:2015-02-11 22:53:01

标签: php arrays sorting

所以我正在使用Google Maps api并检查一些位置距离。

我正在使用一段时间,我正在构建一个json编码(用于移动应用程序)

<?php
$x = 1;
$lats = array("47.070611", "47.114438", "47.166981", "47.259799", "47.073114");
$long = array("21.921930", "21.937037", "21.950941", "22.002783", "21.958194");
$locations = array();
while($x <= count($lats)) {
    usleep(200000);
    $origin="47.072222, 21.921111";
    $desti="$lats[$x], $long[$x]"; 

    //replace the spaces with "+"
    $address1 = str_replace(' ', '+', $origin);
    $address2 = str_replace(' ', '+', $desti);

    //use concatenation as answered by @geocodezip
    $routes=json_decode(file_get_contents('http://maps.googleapis.com/maps/api/directions/json?origin='.$address1.'&destination='.$address2.'&alternatives=true&sensor=false'))->routes;

    //sort the routes based on the distance
    usort($routes,create_function('$a,$b','return intval($a->legs[0]->distance->value) - intval($b->legs[0]->distance->value);'));

    //print the shortest distance
    $dist = $routes[0]->legs[0]->distance->text;
    $loc = array();
    if (empty($dist)) {
    }else{
        $loc = array('km'=>$dist);

        array_push($locations, $loc);
    }

    $x++;

}

print '{"distanta":'.json_encode($locations).'}';
?>

结果将是:

{"distanta":[{"km":"6.9 km"},{"km":"2.3 km"},{"km":"7.2 km"},{"km":"4.3 km"}]}

但是我想对结果进行排序,以便数组中的第一个值最低,最后一个数组中的最后一个值(DESCENDING)

我希望得到这个:

{"distanta":[{"km":"2.3 km"},{"km":"4.3 km"},{"km":"6.9 km"},{"km":"7.2 km"}]}

任何帮助将不胜感激,我是PHP的新手

2 个答案:

答案 0 :(得分:1)

一种方法是:

  • $locations数组中存储纯数字(距离):

    $dist = $routes[0]->legs[0]->distance->text;
    if (!empty($dist)) {
      array_push($locations, $loc);
    }
    
  • 计算完所有距离后(即在while循环之外),sort $locations数组以数字形式显示:

    sort($locations, SORT_NUMERIC);
    
  • 然后,将数组更改为数组数组,包括km个键:

    foreach ($locations as &$loc) {
      $loc = array('km' => $loc);
    }
    
  • 最后,使用json_encode(),就像你一样:

    print '{"distanta":'.json_encode($locations).'}';
    

答案 1 :(得分:-1)

[编辑] 对不起,我没有充分阅读你的代码,但这样做会有效。我试过了。 将usort($locations, function($a, $b) {return $a['km']-$b['km'];});放在最后一行打印之前,亲眼看看!

--- [老帖子,这是错的] --- 您要做的实际上是对数组升序进行排序。这可以通过asort($locations)轻松实现。 (这不起作用)