PHP排序多维数组,只能排序一列

时间:2012-02-20 22:17:05

标签: php multidimensional-array sorting

首先,是的,这是一个重复的问题,已经在这里被问了100次,而且我已经阅读了很多帖子,但是给出的例子对我来说并不是100%工作,我无法弄清楚哪里出错了。

我想通过'distance'键对这样的数组进行排序,我希望排序在整个数组中“扩展”,以便重新排序数组中的所有键。从本质上讲,就像您在电子表格中对列进行排序并在所有列中展开排序一样。

以下是示例数组:

$locations = array ( 
[phone] => Array ( 
    [0] => 555-123-1234 
    [1] => 555-456-4321 
    [2] => 555-789-1122 
    [3] => 555-321-1111 ) 
[address] => Array ( 
    [0] => 123 Main Street BigCity, NY 12345
    [1] => 456 Maple Street Somewhere, UT 87654
    [2] => 999 1st Ave MyTown, VA 23456
    [3] => 321 2nd Ave MyTown, VA 23456 ) 
[distance] => Array ( 
    [0] => 24.56
    [1] => 13.05
    [2] => 23.99
    [3] => 1.75 ) 
[name] => Array ( 
    [0] => First Location
    [1] => Second Location
    [2] => Third Location
    [3] => Fourth Location ) 
)

我正在尝试按'距离'对数组进行排序,我尝试使用array_multisort()函数和usort()函数...但只有“multisort”通过排序得到了几乎可用的结果只有距离,而不是根据距离对整个数组进行排序。

我的功能:

array_multisort($locations['distance'], SORT_NUMERIC);

然后我运行一个“for”循环来遍历数组并按键吐出值。结果是距离是有序的,但位置名称,地址等不会被重新排序。

我在这里缺少什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

您的数组按列排列,而array_multisort()以这种方式使用时,则需要按行排列。

如果你这样做,它应该是你将得到的结构:

$rows = array();
while ($row = $result->fetch_assoc()) $rows[] = $row;

...使用MySQLi结果对象。

您可以非常轻松地将现有阵列重新格式化为此结构:

$locationsAsRows = array();
for ($i = 0; isset($locations['phone'][$i]); $i++) {
  $locationsAsRows[$i] = array (
    'phone' => $locations['phone'][$i],
    'address' => $locations['address'][$i],
    'distance' => $locations['distance'][$i],
    'name' => $locations['name'][$i]
  );
}
var_dump($locationsAsRows);

现在,当你这样做时:

array_multisort($locations['distance'], SORT_NUMERIC, $locationsAsRows);
var_dump($locationsAsRows);

...您可以看到数据已经排序。请注意,我不仅传递了您想要排序的列数据,还将整个“行格式化”$locationsAsRows数组作为最后一个参数传递。这是通过引用传递的,因此$locationsAsRows本身将是您调用array_multisort()后的排序数据。

现在让我们说两个distance值相同 - 我们需要提供第二个优先级搜索列。接下来,我们可以按address排序,我们可以这样做:

array_multisort($locations['distance'], SORT_NUMERIC, $locations['address'], SORT_ASC, $locationsAsRows);

See it working并玩弄它......

答案 1 :(得分:0)

array_multisort($locations['distance'],$locations['name'],$locations['address'],$locations['phone'],SORT_NUMERIC);

也许这会完成这项工作?