Ваш массив упорядочен по столбцам, тогда как 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);
Посмотрите, как это работает и поиграйте с этим ...