0

假设我有一些从 JSON 请求返回的东西,基本上看起来像这样——

$data = array('0'=> array('name' => 'Dr. Smith',
                          'address' => '3002 Fake Ave.',
                          'lat' => '34.711158',
                          'lng' => '-137.803578',
                          'phone' => '714.939.1324'),
              '1' => array('name' => 'Dr. Paul',
                           'address' => '801 Fake St.',
                           'lat' => '31.749917',
                           'lng' => '-137.834388'));

如何按元素之一对其进行排序?假设我想按元素对整个数组进行排序Lat?并将它放回$data元素中,这样我就可以继续使用它。

我已经阅读了关于 PHPusort并按子数组元素排序的内容,但是当我尝试使用他们的代码示例时,它们不起作用。

4

2 回答 2

0

usort 的回调函数将接收您的两个数组条目(它们本身就是数组)并且必须回答 $a 是在 $b 之前还是之后。

例如该函数将接收

  $a = array('Lat' => 45, 'Name' => 'Mickey Mouse', ...)
  $b = array('Lat' => 47, ...)

所以如果你想按 Lat 元素排序,你会使用,

  function sort_by_lat($a, $b)
  {
      return $a['Lat'] - $b['Lat']; // or b - a to sort the other way
  }

  usort($array, "sort_by_lat");

您可能遇到的一个问题是,如果按经度排序,您可能会认为 -1 小于 +1,而 -179 小于 +180。这可能是也可能不是您所期望的。在这种情况下,您需要使用 if(),和/或引入一些转换。

要按名称排序,您可以执行

 if ($a['field'] > $b['field']) return 1;
 if ($a['field'] == $b['field']) return 0;
 return -1;

(再次反转 +1 和 -1 以另一种方式排序)。

于 2012-07-07T01:03:25.300 回答
0

不要忘记您的所有数据都是以字符串形式输入的,因此您需要将数值转换为浮点数以进行适当的比较。

http://codepad.org/p2EMfTDR

$data = array('0'=> array('name' => 'Dr. Smith', 'address' => '3002 Fake Ave.', 'lat' => '20.711158', 'lng' => '10.803578', 'phone' => '714.939.1324'), '1' => array('name' => 'Dr. Paul', 'address' => '801 Fake St.', 'lat' => '10.749917', 'lng' => '20.834388'));

function cmpLat($a, $b)
{
    if(floatval($a['lat']) > floatval($b['lat'])) {
        return 1;
    } elseif(floatval($a['lat']) < floatval($b['lat'])) {
        return -1;
    } else {
        return 0;
    }
}

function cmpLng($a, $b)
{
    if(floatval($a['lng']) > floatval($b['lng'])) {
        return 1;
    } elseif(floatval($a['lng']) < floatval($b['lng'])) {
        return -1;
    } else {
        return 0;
    }
}

usort($data, "cmpLat");

print_r($data);

usort($data, "cmpLng");

print_r($data);
于 2012-07-07T01:10:47.247 回答