![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
flashaa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Есть массив.
У него много ключей, cреди них есть 3 ключа user, free, our по которым массив должен быть отсортирован. Первичная сортировка должна быть по ключу user, т.е. все элементы массива, где user = 1, идут вверх. Элементы, где user = 0 , идут вниз. Вторичная сортировка по ключу free с аналогичной логикой. И третья сортировка должна быть как следуюет из логики по ключу our. Как будут сортироваться элементы с одинаковыми значениями ключей, между собой - не имеет смысла. Т.е. сначала элементы отсортировываются на 2 группы (user 1 - cверху, user 0 - снизу), затем внутри каждой из групп происходит сортировка ещё на 2 группы (free 1 - сверху, free 0 - снизу ). Получает уже 4 группы. Затем происходит сортировка по 3 критерию внутри каждой из 4 групп их становится уже 8. Как это лучше реализовать? Вот так я реализовал деление на 2 первые группы:
Уже чересчур громоздко, если добавить ещё 3 критерий, то условий будет намного больше. В сортировке я малоопытен. |
|||
|
||||
flashaa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Немного запутано сказал.. Есть массив, в котором элементы - массивы с нескольким ключами
Вот в нем надо переставить внутренние array по описанному выше алгоритму. |
|||
|
||||
flashaa |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Если сделать имена ключей по алфавиту в порядке убывания приоритета и использовать array_mulisort, то вроде сортировка правильная, только это установлено экспериментально. Что что скажет? |
||||
|
|||||
A1ekcandr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
похоже ты сам ответил на свой вопрос
![]() |
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Хм... вроде логично (причем даже multisort избыточен - обычного sort должно хватить;), но настораживает, что для работоспособности этого шаманства важен алфавитный порядок ключей (по идее ведь, при сравнении массивов они и так ведь должны анализироваться в том порядке, в каком заданы). Вообще, имхо, сравнение массивов на "больше-меньше" - вещь слишком экзотическая, чтоб очень сильно на нее полагаться. По крайней мере, в мануале соотв. операторы явно не описаны (только "равно" и "не равно").
А поменять местами "строки" и "столбцы" массива никак нельзя (чтобы было 'user'=>array(1,0,0,1, ... ,0), 'free'=>(0,0,1,1, ..., 1) и т.д.)? И воспользоваться array_multisort штатным образом. И, кстати, откуда эти данные берутся - если из БД, нельзя ли получать их оттуда уже отсортированными как надо? Это сообщение отредактировал(а) SelenIT - 6.3.2008, 13:16 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
flashaa |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
SelenIT,
Ключи добавляются в разном порядке, потому лучше назвать их алфавитно, затем сделать ksort();
Непонял, почему сравнение МАССИВОВ ? Ведь сравниваются же ключи - скалярные выражения. Подобное сравнение происходит при работе функции array_multisort? Можно раскрыть тайну ее работы, потому что я ее так и не знаю. Данные генерируются в самой программе, так что вообщем-то можно поставить их в любом порядке. Только объясните, зачем? |
||||
|
|||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Потому что элементы массива $arr, переданного аргументом в array_multisort, являются массивами ![]() -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
flashaa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
SelenIT, вы уверены что элементы сравниваются именно на больше/меньше/равно? По поводу стремности совершенно согласен. Если вдруг при составлении массива выскочило исключение, то один подмассив не достроился и сравнение с ним уже идет по-другому. Кстати он оказался вообще в конце всех, хотя должен был иметь наивысший приоритет судя по ключу user.. Вы правы, но как более надежно сортировать?
|
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Конечно, как же иначе? Что еще может быть основание для порядка "убывает-возрастает"? Либо "довести до ума" вариант с usort, для простоты не заморачиваясь с анонимной функцией (от явного создания ф-ции ничего не убудет, да и три вложенных условия - не такая уж большая сложность), либо "транспонировать" массив и использовать array_multisort обычным образом. Либо заполнять массив сразу в нужном порядке, используя по сути ту же ф-цию сравнения и array_splice. Других вариантов я не вижу... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
<self-moderated>была написана чушь - перепутал с JS
![]() Самый "лобовой" вариант ф-ции сравнения, проверенный:
Это сообщение отредактировал(а) SelenIT - 6.3.2008, 23:41 -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
flashaa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
SelenIT, спасибо за помощь. Пока остановился на usort. Но если вдруг будут проблемы со стабильностью, использую ваше предложение.
|
|||
|
||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 32 Всего: 401 |
Так функция выше для usort и предназначена. Проблем со стабильностью возникать не должно, вроде все ж явно предусмотрено...
![]() -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
flashaa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |