[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как начать обходить древовидный массив
Страницы: 1, 2
chee
Допустим имеем такой массив

array(
'a' => array(
'c' => array(
),
),

'b' => array(
'd' => array(
'f' => array(
),
),

'e' => array(
),
)
);


И например хочет начать его обработку с вложенного массива с ключом 'd', то есть сначала обработать f, потом e, потом b, потом c, после чего a, а затем все соединить

Есть какой-нибудь известный алгоритм?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
walerus
chee Да, рекурсия называется.
chee
walerus, ты прочитал вопрос полностью? я понимаю что мне придется ее использовать, но тут ее явно недостаточно.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
chee, если честно, то я сомневаюсь, что ты найдешь какой-то готовый алгоритм. Потому что задача, насколько я понял, совершенно не стандартная.
И кстати, в твоем описании так до конца и не понятно, что же ты хочешь получить в итоге: "а затем все соединить". Каким образом соединить???

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
Цитата (chee @ 14.05.2017 - 14:44)
И например хочет начать его обработку с вложенного массива с ключом 'd', то есть сначала обработать f, потом e, потом b, потом c, после чего a, а затем все соединить

так все рекурсии и работают.
Сначала опускаешься на максимальну глубину, потом идешь вверх по родителям.
Что walerus тебе и сказал


_____________
[продано копирайтерам]
chee
Цитата (AllesKlar @ 14.05.2017 - 22:23)
Сначала опускаешься на максимальну глубину, потом идешь вверх по родителям.

Это плохой вариант, я рассматривал вариант превращения дерева в плоский массив элементов, который заканчивается на d, а заканчивается конревым элементом. Проблема в алгоритме формирования такого массива.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Valick
chee, в БД есть индексы, тебе необходимо городить что-то подобное. А еще есть XML и в частности XSLT где всё это уже давно реализовано.

_____________
Стимулятор ~yoomoney - 41001303250491
chee
Valick, в БД индексы используются для поиска информации и только, а мне же нужно найти место и начать обрабатывать структуру начиная с этого места. XSLT слишком неудобный инструмент для этой задачи, сам XSLT достаточно трудоёмок для изучения, так и писать хорошо работающие решения на нём очень сложно (было дело, юзал его в рабочих задачах, для преобразования XML в другие XML).


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Michael
Цитата (walerus @ 14.05.2017 - 14:46)
chee Да, рекурсия называется.

рекурсия - это общее название, а вопрос в реализации.
И не факт что она тут в этом дереве подойдет, проходы обычно идут по связанным узлам, а у ТС f-e, b-c не связаны никак



_____________
There never was a struggle in the soul of a good man that was not hard
walerus
Michael
Цитата
не связаны никак

Как это не связаны? - связаны, общим массивом в котором они расположены.

по теме назрел вопрос к ТС, а суть всех манипуляций в итоге какая?, что из данного массива нужно получить? Вопрос возник после слов:
Цитата
мне же нужно найти место и начать обрабатывать структуру начиная с этого места.
т.е. получается не обязательно должен быть последний внутренний элемент ? Как то двусмысленно стоит задача...

Расскажи что ты хочешь получить, может будут другие какие мысли...
chee
walerus, в итоге хочу получить плоский массив с последовательностью такой
d, f, e, b, a, c, root (корневой элемент)

Порядок построения этого плоского массива
- текущий
- затем дети
- затем соседи
- затем родители

если начинать обходить с f, то должно быть так

f, d, e, b, a, c, root

для c, так

c, a, b, d, f, e, root

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
walerus
array(
'a' => array(
  'c' => array(
  ),
),

'b' => array(
  'd' => array(
  'f' => array(
  ),
  ),
  'e' => array(
  ),
)
);


Нет, не сходится логика... или же я ее не понял.
Смотри ты хочешь "от конца в начало"... тогда:
при запросе - f, будет последовательность fedbca root, т.е. именно от последнего к первому
при запросе - с, будет последовательность ca root и все!

А то что ты написал, не укладывается в логику END -> START... потому что, в одном случае он перебирает "назад" массив, и тут же вперед, как так?

И еще не понятно, тебе ключи нужны или манипуляции со значениями этих ключей?
chee
Цитата (walerus @ 15.05.2017 - 21:53)
от конца в начало

нет, я хочу из определенной точки в начало и в конец. Но по факту root всегда будет последним, а тот с кого начинали первым.
Цитата (walerus @ 15.05.2017 - 21:53)
И еще не понятно, тебе ключи нужны или манипуляции со значениями этих ключей?

значения, ключи меня не очень интересуют. Ключи я использую для наглядности того что я хочу получить.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
walerus
chee Блин абстракция какая то laugh.gif
все зашифровано у тебя, не знаю чем и помочь то rolleyes.gif
chee
Я попробую свои размышления по поводу алгоритма выразить:

1. Это будет рекурсивный обход сверху-вниз (очевидно было)
2. По мере прохода надо создавать что-то типа логических веток с приоритетом
3. Ветка, которая содержит элемент с маркером (маркер- метка определяющая, что именно с этого места элемента начинать строить плоский массив), имеет более высокий приоритет по сравнению с остальными.

Хотя возможно, приоритеты это лишнее.

Если так посудить. То по факту, вариативность последовательностей не очень большая, то есть если в пределах одной ветки менять позицию маркера, то последовательность ключей для других веток можно просто пересчитать сверху-вниз.

На примере:
d, f, e, b, a, c, root - одна позиция в N1-ветке
f, d, e, b, a, c, root - другая позиция в N1-ветке
c, a, b, d, f, e, root - одна позиция в N2-ветке

Если посмотреть, то в ветке N1 есть паттерн, который говорит о том что меняется только часть последовательности, а остальная остается такой же. В итоге можно сделать такой предположение, заранее пересчитать все ветки сверху вниз. А потом уже после найденной нужной ветки(с маркером) рассортировать их в нужно порядке

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.