- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Что-то я застрял со следующей задачей :gm: :
Есть результат запроса NestedSets-дерева отсортированный (как надо) по левому ключу:
Требуется сконвертировать это в массив со вложенными массивами веток, т.е.
Помогите, пожалуйста, с алгоритмом. :gm:
У вас в массиве у элемента нет идентификатора родительского элемента. Всегда дочерние элементы следуют строго за родительским, причём в порядке возрастания вложенности? Если да, алогоритм напишу, если нет - алгоритм невозможен в принципе.
кстати хотел заметить, что в принципе достаточно такой структуры:
name, parent_id:
если parent_id == -1 то это корень, другое значение ссылается на родителя.
кстати хотел заметить
Вряд ли это кстати. Топикстартер говорит о дереве NestedSets.
Николай В., левого ключа и уровня для такой сортировки недостаточно. Правый ключ также нужен.
А, соббсно, в чем проблема? Или я не могу понять непостижимой глубины поставленной задачи? 😮
Имхо, это классическая задача на перевод бинарного дерева в обычное (обратите внимание на то, как перечислены субъекты в списке)
Подробнее:
Да, задача не тривиальная :) Тоже пришлось побиться минут 15.
Самый логичный, казалось бы путь - пройтись по линейному списку и дать каждому элементу parent_id, а зетем уже конвертировать в дерево с момощью рекурсии.
Но есть более быстродействиенный метод:
Тут приходится прибегать к функции eval() - это сильно усложняет чтение кода и портит его логику. Программисты не любят эту функцию. Но использовать здесь рекурсию, имхо, еще хуже :)
В общем, идея такая: мы пробегаемся по списку и для каждого элемента генерим строку вроде
а затем заставляем интерпретатор отработать эту строку с помощью eval().
В массиве $way мы храним номера родительских элементов. То есть 3, 4, 5. Если level текущего элемента больше level прошлого элемента, добавляем к этому массиву номер текущего элемента. Если они равны - убираем один и заменяем его новым. Если level текущего элемента меньше, чем level прошлого, убираем два номера и добавляем текущий.
Скрипт работает. Проверил.
Только для простоты ключами многоуровневого массива сделал id элементов. Но это вам, я думаю, несущественно.
Исходный массив $list
Получаем $array
зетем уже конвертировать в дерево с момощью рекурсии.
Можно сразу в дерево, не назначая предка:
dkameleon, благодарю. То что надо.
Господа и дамы, спасибо огромное всем за помощь.