2011-09-20 146 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