2011-03-14 97 views
6

我有这样的阵列排序使用多维阵列在array_multisort

Array 
(
    [0] => Array 
     (
      [brand] => blah blah 
      [location] => blah blah 
      [address] => blah blah 
      [city] => blah blah 
      [state] => CA 
      [zip] => 90210 
      [country] => USA 
      [phone] => 555-1212 
      [long] => -111 
      [lat] => 34 
      [distance] => 3.08 
     ) 
    [1] => Array 
     (
      [brand] => blah blah 
      [location] => blah blah 
      [address] => blah blah 
      [city] => blah blah 
      [state] => CA 
      [zip] => 90210 
      [country] => USA 
      [phone] => 555-1212 
      [long] => -111 
      [lat] => 34 
      [distance] => 5 
     ) 
. 
. 
. 

} 

我希望能够通过距离在散列阵列排序。帮帮我!非常感谢

+0

array_multisort向后:它对列数组进行排序。 (实际上,它将表示列的多个独立数组排序)。这几乎从来都不是你想要的:可以转置你的数组,或者使用像usort这样有用的东西。 – aib 2011-03-14 23:48:22

回答

18

您需要首先提取所有距离,然后将距离和数据都传递给函数。如array_multisort文档中的示例3所示。

foreach ($data as $key => $row) { 
    $distance[$key] = $row['distance']; 
} 

array_multisort($distance, SORT_ASC, $data); 

这里假设你想在最短的距离第一,否则改变SORT_ASCSORT_DESC

2

使用可以使用usort;

function cmpDistance($a, $b) { 
    return ($a['distance'] - $b['distance']); 
} 

usort($array, "cmpDistance"); 
+0

许多比较函数返回正数/负数而不是显式地-1和1的原因是使这样的函数更简单。函数的主体可以是'return $ a ['distance'] - $ b ['distance']' – Jacob 2011-03-14 23:04:40

+0

为什么我会遇到“致命错误:无法重新声明cmp()”?我很困惑 – dst11 2011-03-14 23:05:19

+0

@Jacob,你是对的,我已经更新了代码。谢谢! – Czechnology 2011-03-14 23:06:41

1

如果你想避免循环,你可以使用array_column函数来实现你的目标。 例如,

要排序如下阵列距离排序

$arr = array(0 => array('lat' => 34,'distance' => 332.08),1 => Array('lat' => 34,'distance' => 5),2 => Array('lat' => 34,'distance' => 34));

使用下面一行的阵列将距离现在

array_multisort(array_column($arr, 'distance'), SORT_ASC,SORT_NUMERIC,$arr);

$是排序arr含有排序排列由距离