通过每个子数组中的元素对嵌套数组进行排序

时间:2012-07-07 00:56:52

标签: php sorting multidimensional-array

假设我有一些从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元素中,以便继续使用它。

我已经在PHP上阅读了关于usort的内容并按子数组元素进行排序,但是当我尝试使用他们的代码示例时,它们无法正常工作。

2 个答案:

答案 0 :(得分: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,以另一种方式排序)。

答案 1 :(得分: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);