![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Aliance |
|
||||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
А как бы вы решили следующую задачу:
Имеем массив, допустим такой:
И имеем шаблон сортировки его по ключам, допустим такой:
В итоге должны получить следующее:
|
||||||
|
|||||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 2 Всего: 13 |
А какие вообще условия. Нужно оптимально быстро, или максимально коротко, или просто красиво? А значения у ключей всегда идут по возрастанию от 1? А в шаблоне ключи всегда присутсвуют в массиве?
|
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
На самом деле условия немного некорректны изначально. Потому что в асс. массиве не может быть важен порядок. Но так уж сложилось, что работает "как есть" :(
Из вышеперечисленного важно все, наиболее важна, конечно, скорость, но не в потерю читаемости. Два вызова array_search в цикле - это дороговато ПС: Ключи и значения выбраны случайно. Задача обобщена. В частном виде, нужно поменять местами два элемента асс. массива, зная их ключи. |
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 2 Всего: 13 |
Можно перед вызовом функции закешировать индексы в отдельный ас. массив.
А можно пример? Я просто не вижу практического применения задачи. Я до этого даже не знал что можно сортировать ключи |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Структура навигации хранится в массиве, в рамках A/B тестирования нужно тестовой группе поменять местами два элемента меню. |
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 2 Всего: 13 |
Это можно сделать созданием нового массива, то есть за O(n)
Быстрее уж некуда, нету такого способа о котором я бы знал |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Написал примерно так:
Все правильно делает, но вот если один из элементов отсутствует, то во-первых фатал (ну это лечится-то легко, isset`ом, но при этом задача не проходит уже тесты). Получается нужно не просто поменять два элемента местами, а нужно некоторые элементы поставить на определенную позицию. В примере выше это элемент с ключом bbb (второй по порядку) нужно сделать четвертым, а четвертый ddd - вторым. При этом нужно чтобы все работало даже, если одно из (bbb или ddd) не будет (позиции соответственно сдвигаются тогда). Получается даже нужно отталкиваться не от порядковой позиции, а от позиции найденного элемента. Что не вычислить без второго цикла. В общем мне нужен отпуск |
|||
|
||||
| whatisnot |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 14.12.2014 Репутация: 1 Всего: 2 |
А нет, значения сволочь переставит от сортировки. Надо подумать, что-то вертится на языке... ) Вот так:
Это сообщение отредактировал(а) whatisnot - 6.3.2015, 01:37 |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Aliance, Если набор полей массива ограничен и нужно постоянно выдавать результат в определенном порядке и аборе полей (вывод полей csv, например). То можно иметь уже отсортированный правильно массив ключей и array_merge' ем подсовывать туда данные
Решение, вероятно, из разряда "коротких". Хотя должно быть и довольно быстро. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
как отсортировать-то? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Aliance, А как формируется изначальный массив с правильным порядком ключей? Вот так же. Явно определить
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
ksnk, то как он формируется менять нельзя. можно работать только со сформированным, меняя там элементы. поменять порядок в асс. массиве можно только пересобрав его
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Aliance, Тоесть, на момент, когда нужно сортировать есть только массив с именами полей?
функция array_fill_keys поможет состряпать нужный формат.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
ksnk, ты, видимо, отталкивался от условия из первого поста, а в ходе обсуждения я его конкретизировал. нужно поменять местами два элемента в асс. массиве, зная их ключи, соблюдая следующие условия:
- обоих ключей может не быть - тогда ничего не делаем - может не быть одного из ключей - тогда нужно второй элемент поставить на то место, где должен был бы быть первый. вот это "должен был бы быть" весьма кривое понятие, потому что: -- элементы могут быть отсортированы в рандомном порядке до выполнения моего кода, соответственно я не знаю эту позицию заранее -- элементы могут быть удалены (unset) до моего кода, соответственно я не знаю, будут ли они оба в момент исполнения моего кода. В общем такие трудности возникли из-за неграмотной архитектуры конкретного участка кода, решил задачу костыльно - вызываю свой презентер сразу после объявления массива, гарантируя, что оба элемента в нем присутствуют, просто их меняю местами функцией, как предложили выше, а потом они могут быть удалены (unset) ниже по коду, но они уже примут нужное мне положение. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Aliance, угу, извиняюсь . Так далеко я ниасилил :(
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |