рекурсия, как отдать путь до найденного массива во вне

predator

web designer
поясню
есть древовидный массив
рекурсивная функция обходит массив
когда встречается вложенный массив у которого нет подмассивов - задача решена
как передать путь до найденного узла вызвавшему рекурсию коду
чтобы в нём работать с этим подмассивом?
например заменить подмассив строкой

единственные варианты которые я предполагаю это переменная переменная и eval
но есть ли более простой способ?
 

AmdY

Пью пиво
Команда форума
передавай параметром в рекурсивную функцию путь
интересно, а как это сделать с eval ?
 

predator

web designer
мне нужно получить из рекурсии путь до первого подходящего массива
и потом работать с ним
а не по определённому пути получить массив
изначально пути я не знаю
путь составляется во время рекурсии
 

AmdY

Пью пиво
Команда форума
PHP:
function foo($data, $path='') {
if (...) foo($newDataValue, $path.'-'.$newDataKey)
if (...) return $path;
}
 

AmdY

Пью пиво
Команда форума
чудо, это делать с eval, даже не представлю куда его можно всунуть. покажи код.
 

predator

web designer
PHP:
		foreach( $arrArticles as $k=>$v ) {
			if ( $v[0]=='complete' ) {
				continue;
			}
			$_arrPath=array();
			$this->exploreTree( $v, $_arrPath );
			if ( empty( $_arrPath ) ) {
				array_unshift( $arrArticles[$k], 'complete' ); // маркер оптимизирующий работу
				continue;
			}
			$_arrPath=array_reverse( $_arrPath );
			eval( '$arrVar=$arrArticles[$k]['.join( '][', $_arrPath ).'];' );
			foreach( $arrVar as $_strVariant ) {
				eval( '$v['.join( '][', $_arrPath ).']=$_strVariant;' );
				$arrArticles[]=$v;
			}
			unSet( $arrArticles[$k] );
		}
 

флоппик

promotor fidei
Команда форума
Партнер клуба
*захлебнулся чаем*
Блин, мне даже сказать нечего...
 

predator

web designer
чтобы народ не захлёбывался чаем ; )

расскажу для чего это надо
на входе текст с вариантами например
test1 {test2|test3} test4 {test5|test6} test7 {test8|test9}
на выходе должно получится
test1 test2 test4 test5 test7 test8
test1 test3 test4 test5 test7 test8
test1 test2 test4 test6 test7 test8
test1 test3 test4 test6 test7 test8
test1 test2 test4 test5 test7 test9
test1 test3 test4 test5 test7 test9
test1 test2 test4 test6 test7 test9
test1 test3 test4 test6 test7 test9
8 различных текстов

я получаю исходный код преобразую его в древообразный массив (могут быть вложенные варианты)
и потом "методом упрощения" генерирую статьи
в результате у меня массив одноменрных массивов которые соответствуют одной статье

остаётся только сделать join

евал нужен чтобы получить первый встретившийся подмассив который не содержит подмасивов
и на его основе сгенерить копии древообразного массива где все вхождения этого первого встретившегося
заменять на вэлью этого первого встретившегося

я сам в шоке ))
 

predator

web designer
если кто-то предложит более простое решение буду премного блегодарен
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Почему-то мне вспомнилось кое-чье тестовое задание по приему на работу — или мне это померещилось?
 

AmdY

Пью пиво
Команда форума
флоппик
всё хуже, это сеошники, а эти тексты скоро будут в поиске :(
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Тогда это надо полюбому делать эвалом — чтоб памяти не хватило ;)
 

predator

web designer
лично я не сеошник
проект такое

на форуме, я смотрю, появился клуб а-ля 12 злобных зрителей ))
 

AmdY

Пью пиво
Команда форума
эвал не так страшен как его рисует, но указывает на проблемы с логикой. алгоритм можно сменить простым и понтным двойным проходом :
1. прошлись и вырезали {...|...}, оставили %s, а {...|...} превратили в массивы
2. с помощью комбинаторики составили все возможные варианты
3. для каждого варианта sprintf(текст из 1, варианты)
 

predator

web designer
хороший вариант

дело осложняется тем что могут быть подмножества - {first {text|article|etc} variant|second variant}
поэтому было принято решение текст транслировать в древообразный хэш

генерация текстов сходу в рекурсии. до конца не додумал. в этом случае поидее надо для каждой ноды определять - надо её использовать в новом варианте или нет.
предложили на вид более простой алгоритм:
1)
test1 {test2|test3} test4 {test5|test6}
2)
test test2 test4 {test5|test6}
test test3 test4 {test5|test6}
3)
test test2 test4 {test5}
test test3 test4 {test6}
test test2 test4 {test5}
test test3 test4 {test6}

он не всегда корректно работает + в этом случае пришлось применять eval
проблема с логикой - согласен, поэтому и решил создать тему на форуме

AmdY, поидее к твоему варианту тоже можно применить рекурсию
т.е. в первом пункте нужно будет пройти по полученным массивам и если в строках встречаются {...|...} обработать из также
правильно ли я понял?
 

AmdY

Пью пиво
Команда форума
здесь была уже тема как парсить такую строку. давно правда, можешь поискать, но не помню чем закончилось.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
евал нужен чтобы получить первый встретившийся подмассив который не содержит подмасивов
и на его основе сгенерить копии древообразного массива где все вхождения этого первого встретившегося
заменять на вэлью этого первого встретившегося
это _лучшее_ описание зачем нужен эвал, какое я когда-либо видел!
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я вижу естественное решение маленьким конечным автоматом (или 2мя) в 1 проход
sprintf или join - дело вкуса
и не надо здесь никаких разрывов шаблонов придумывать
 
Сверху