Допустим имеем такой массив
array(
'a' => array(
'c' => array(
),
),
'b' => array(
'd' => array(
'f' => array(
),
),
'e' => array(
),
)
);
И например хочет начать его обработку с вложенного массива с ключом 'd', то есть сначала обработать f, потом e, потом b, потом c, после чего a, а затем все соединить
Есть какой-нибудь известный алгоритм?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
walerus
14.05.2017 - 16:46
chee Да, рекурсия называется.
walerus, ты прочитал вопрос полностью? я понимаю что мне придется ее использовать, но тут ее явно недостаточно.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
14.05.2017 - 22:07
chee, если честно, то я сомневаюсь, что ты найдешь какой-то готовый алгоритм. Потому что задача, насколько я понял, совершенно не стандартная.
И кстати, в твоем описании так до конца и не понятно, что же ты хочешь получить в итоге: "а затем все соединить". Каким образом соединить???
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
AllesKlar
14.05.2017 - 22:23
Цитата (chee @ 14.05.2017 - 14:44) |
И например хочет начать его обработку с вложенного массива с ключом 'd', то есть сначала обработать f, потом e, потом b, потом c, после чего a, а затем все соединить |
так все рекурсии и работают.
Сначала опускаешься на максимальну глубину, потом идешь вверх по родителям.
Что walerus тебе и сказал
_____________
[продано копирайтерам]
Цитата (AllesKlar @ 14.05.2017 - 22:23) |
Сначала опускаешься на максимальну глубину, потом идешь вверх по родителям. |
Это плохой вариант, я рассматривал вариант превращения дерева в плоский массив элементов, который заканчивается на d, а заканчивается конревым элементом. Проблема в алгоритме формирования такого массива.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Valick
15.05.2017 - 09:14
chee, в БД есть индексы, тебе необходимо городить что-то подобное. А еще есть XML и в частности XSLT где всё это уже давно реализовано.
_____________
Стимулятор ~yoomoney - 41001303250491
Valick, в БД индексы используются для поиска информации и только, а мне же нужно найти место и начать обрабатывать структуру начиная с этого места. XSLT слишком неудобный инструмент для этой задачи, сам XSLT достаточно трудоёмок для изучения, так и писать хорошо работающие решения на нём очень сложно (было дело, юзал его в рабочих задачах, для преобразования XML в другие XML).
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Michael
15.05.2017 - 13:18
Цитата (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
15.05.2017 - 21:09
Michael
Как это не связаны? - связаны, общим массивом в котором они расположены.
по теме назрел вопрос к ТС, а суть всех манипуляций в итоге какая?, что из данного массива нужно получить? Вопрос возник после слов:
Цитата |
мне же нужно найти место и начать обрабатывать структуру начиная с этого места. |
т.е. получается не обязательно должен быть последний внутренний элемент ? Как то двусмысленно стоит задача...
Расскажи что ты хочешь получить, может будут другие какие мысли...
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
15.05.2017 - 21:53
array(
'a' => array(
'c' => array(
),
),
'b' => array(
'd' => array(
'f' => array(
),
),
'e' => array(
),
)
);
Нет, не сходится логика... или же я ее не понял.
Смотри ты хочешь "от конца в начало"... тогда:
при запросе - f, будет последовательность fedbca root, т.е. именно от последнего к первому
при запросе - с, будет последовательность ca root и все!
А то что ты написал, не укладывается в логику END -> START... потому что, в одном случае он перебирает "назад" массив, и тут же вперед, как так?
И еще не понятно, тебе ключи нужны или манипуляции со значениями этих ключей?
Цитата (walerus @ 15.05.2017 - 21:53) |
от конца в начало |
нет, я хочу из определенной точки в начало и в конец. Но по факту root всегда будет последним, а тот с кого начинали первым.
Цитата (walerus @ 15.05.2017 - 21:53) |
И еще не понятно, тебе ключи нужны или манипуляции со значениями этих ключей? |
значения, ключи меня не очень интересуют. Ключи я использую для наглядности того что я хочу получить.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
walerus
16.05.2017 - 00:01
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 есть паттерн, который говорит о том что меняется только часть последовательности, а остальная остается такой же. В итоге можно сделать такой предположение, заранее пересчитать все ветки сверху вниз. А потом уже после найденной нужной ветки(с маркером) рассортировать их в нужно порядке
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.