2011-09-20 110 views
0

可能重复:
PHP sort multidimensional array by value数组排序用索引

我有一个这样的数组 -

Array 
(
    [0] => Array 
     (
      [rest_id] => 1 
      [restname] => Baumgart's Cafe 
      [address] => 158 Franklin Avenue 
      [distance] => 20.3599115829 
     ) 

    [1] => Array 
     (
      [rest_id] => 2 
      [restname] => Brownstone Diner & Pancake Factory 
      [address] => 426 Jersey Avenue 
      [distance] => 12.422657991 
     ) 

    [2] => Array 
     (
      [rest_id] => 3 
      [restname] => Jacques Torres Chocolate 
      [address] => 285 Amsterdam Avenue 
      [distance] => 16.3264917908 
     ) 

    [3] => Array 
     (
      [rest_id] => 4 
      [restname] => Ed's Health Food 
      [address] => 150 Mountain Avenue 
      [distance] => 31.1066764629 
     ) 

我要作为排序依据距离这个数组。 任何帮助表示赞赏。 Thnak你。

+3

使用http://www.php.net/manual/en/function.usort.php? – 2011-09-20 05:37:42

回答

0

这需要使用usort和一个回调来完成。

function cmp($a, $b) 
{ 
    $ret = ($a['distance'] - $b['distance']); // this should actually be a subtraction with a comparison to a small epsilon value due to inconsistencies with floating point arithmetic 

    if ($ret) 
    { 
    $ret = ($ret > 0 ? 1 : -1); 
    } 

    return $ret; 
} 

usort($array, 'cmp'); 
+0

如果第一个参数分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。 – xdazz

+0

这个子排列并不重要。关键是你的回调应该返回一个整数。 – xdazz

+0

检查这一点。 http://codepad.viper-7.com/HD6rG3 – xdazz

0
usort($array, function($a,$b){ 
    if ($a['distance'] === $b['distance']) { 
     return 0; 
    } 
    return ($a['distance'] < $b['distance']) ? -1 : 1; 
}); 
+0

谢谢,可能有帮助 – SandyK

+0

对于downvoter,请说明原因。 – xdazz

+0

实际上,(可能是由于编译器优化)这个答案,并且我的两个当前答案都运行在相同数量的操作中。我原来的答案(简单的减法)事实上更快 - 但由于返回的是浮点数而不是整数,所以不能正确地工作。 Php刚刚失去了我的一些尊重。 – evan

0
usort($array, function($a,$b){ 
    return (($a['distance'] == $b['distance']) ? 0 : (($a['distance'] > $b['distance']) ? 1 : -1)); 
}); 
0

即使PHP的说,它应该平等的答案返回0,它只是对诉诸一个已排序数组,并保留以前的排序为“子样”的必要。这个呢,其实工作:

function cmp($a, $b) 
{ 
    return ($a['distance'] - $b['distance'] > 0 ? 1 : -1); 
} 

usort($array, 'cmp'); 

例子:http://codepad.viper-7.com/6RLCYM