假设我有一些从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
的内容并按子数组元素进行排序,但是当我尝试使用他们的代码示例时,它们无法正常工作。
答案 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)
不要忘记所有数据都以字符串形式出现,因此您需要将数字值转换为浮点值以进行正确比较。
$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);