首先,是的,这是一个重复的问题,已经在这里被问了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”循环来遍历数组并按键吐出值。结果是距离是有序的,但位置名称,地址等不会被重新排序。
我在这里缺少什么?
谢谢!
答案 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);
也许这会完成这项工作?