PHP: Сортировка многомерных массивов
array_multisort()


Часто возникает потребность отсортировать многомерный массив по первому элементу массивов, или по любому, но чтобы остальные элементы то-же "передвигались" согласно с сортируемыми.
Например, требуется отсортировать массивы полученные MySQL запросом из разных таблиц по дате и.т.п.

В мануале PHP есть функция array_multisort() - Сортировка релятивных массивов.
Что же про неё написано, и даже с примерами.... (см. внизу) ... ничего не понятно.

Вот как я делаю.
Надо отсортировать двумерный массив (то есть обычную таблицу) по первому столбцу.

Таблица:
9 7 1
2 4 8
5 1 4
3 2 8

Тут главное не ошибиться в индексах массивов, первым должен быть номер столбца!!!, а вторым строки. То есть как то не привычно, "раком".
По данной таблице:

$ar[0][0]=9;
$ar[1][0]=7;
$ar[2][0]=1;

$ar[0][1]=2;
$ar[1][1]=4;
$ar[2][1]=8;

$ar[0][2]=5;
$ar[1][2]=1;
$ar[2][2]=4;

$ar[0][3]=3;
$ar[1][3]=2;
$ar[2][3]=8;

Это для наглядности. Загнать таблицу в массив просто циклами.
Вот теперь можно сортировать:

array_multisort($ar[0], SORT_ASC, $ar[1], $ar[2]);

Не забываем дописывать в параметрах функции после сортировки по возрастанию (убыванию) остальные индексы столбцов.

После сортировки имеем:

$ar[0][0] - (2);
$ar[1][0] - (4);
$ar[2][0] - (8);

$ar[0][1] - (3);
$ar[1][1] - (2);
$ar[2][1] - (8);

$ar[0][2] - (5);
$ar[1][2] - (1);
$ar[2][2] - (4);

$ar[0][3] - (9);
$ar[1][3] - (7);
$ar[2][3] - (1);

2 4 8
3 2 8
5 1 4
9 7 1

Что нам и надо!

Пример использования можно посмотреть на главной странице, таблица "Обновления в разделах":

http://fc-dynamo.ru/soccer/

Одним SQL заросом, из-за разной структуры таблиц разделов, вытащить данные не удалось. Пришлость загнать их в один двумерный массив PHP, и отсортировать по времени сообщения.

Удачи!!!


Мануал:
Синтаксис:
bool array_multisort(array ar1, [, mixed o1 [, mixed t1 ... [, array ...]]])
Функция array_multisort() сортирует многомерные массивы с сохранением индексной ассоциации, возвращая true при отсутствии ошибок.
Исходные массивы рассматриваются как столбцы таблицы, сортируемой построчно. Поэтому массивы должны иметь одинаковое число элементов, и взаимосвязь между ними, как в строках таблицы, сохраняется. Приоритетом сортировки пользуются первые массивы. Флаги сортировки могут указываться для каждого массива, и их действие распространяется только на тот массив, после которого они указаны.
Флаги определения порядка сортировки (аргументы ox):
SORT_ASC - сортировка в порядке возрастания (по умолчанию)
SORT_DESC - сортировка в порядке убывания Флаги типа сортировки (аргументы tx):
SORT_REGULAR - сравнивать элементы как есть (по умолчанию)
SORT_NUMERIC - сравнивать элементы как числа
SORT_STRING - сравнивать элементы как строки

Пример:
ar1 = array("10", 100, 100, "a");
ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);
// $ar1 = array("10", "a", 100, 100);
// $ar2 = array(1, 1, "2", 4);

Элементы второго массива, соответствующие одинаковым элементам (100 и 100) первого массива, также отсортированы.
$ar = array(array("10", 100, 100, "a"), array(1, 3, "2", 1));
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], $SORT_NUMERIC, SORT_DESC);

$ar[0] = ("10", 100, 100, "a") - сортируются как строки по возрастанию $ar[1] = (1, 3, "2", 1) - сортируются как числа по убыванию.



Рейтинг@Mail.ru Яндекс.Метрика

При поддержке сайта ФК "Динамо" (Москва)