PHP сортировка многомерного массива, можно отсортировать только один столбец - PullRequest
3 голосов
/ 21 февраля 2012

Во-первых, ДА, это повторяющийся вопрос, который уже задавался здесь 100 раз, и я прочитал многие посты, но приведенные примеры не работают для меня на 100%, и я не могу понять,где я иду не так.

Я хочу отсортировать массив, как это, по ключу «расстояния», и я хочу, чтобы сортировка была «расширена» по всему массиву, чтобы он переупорядочил все ключи в массиве,По сути, так же, как если бы вы отсортировали столбец в электронной таблице и расширили сортировку по всем столбцам.

Вот пример массива:

$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 ]

3 голосов
/ 21 февраля 2012

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

Посмотрите, как это работает и поиграйте с этим ...

0 голосов
/ 21 февраля 2012
array_multisort($locations['distance'],$locations['name'],$locations['address'],$locations['phone'],SORT_NUMERIC);

Может быть, это сделает работу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...