[PHP][Recursion]Извеждане на текущото ниво

Статус
Not open for further replies.

xlebabarov

Registered
Здравейте, да предположим, че имаме следния масив:
Код:
Array
(
    [] => Array
        (
            [3] => 
            [4] => 
            [5] => 
            [ar] => Array
                (
                    [0] => 
                    [kenneth] => 
                    [freesby] => Array
                        (
                            [0] => 
                            [1] => 
                            [johnson] => 
                        )

                )

        )

    [1] => Array
        (
            [3] => 
            [4] => 
            [5] => 
        )

)
Когато изпълняваме следната функция с рекурсия:
Код:
 $a = array(''=>array(3=>'', 4=>'', 5=>'', 'ar'=>array(0=>'', 'kenneth'=>'', 'freesby'=>array(0=>'', 1=>'', 'johnson'=>''))), 1=>array(3=>'', 4=>'', 5=>''));


define("PTA", array(
 "boolean", //0
 "integer", //1
 "double", //2
 "float", //3
 "string", //4
 "array", //5
 "object", //6
 "resource", //7
 "resource (closed)", //8
 "NULL", //9
 "unknown type" //10
 ));


function gaka($arr=array(), $pass=array()){
	ksort($arr);
	
	foreach($arr as $key[0]=>$val[0]){
		if((gettype($val[0])==PTA[5]))
			
		{ 	echo '-'.$key[0]."\n";
			gaka($val[0]);}
		else
		{ echo $key[0]."\n"; }
	}	
}
Получаваме:
Код:
-
-ar
0
-freesby
0
johnson
1
kenneth
3
4
5
-1
3
4
5
Но как да изведем в кое ниво се намира изпълнението на рекурсивната функция за всеки ключ? :cry:
 
Ползвай брояч и подавай референция към този брояч всеки път като влезеш в рекурсия.
 
А може ли някакъв примерен код
 
Най-естественото нещо, което можеш да направиш, когато ти трябва някаква стойност във функция, е да я приемеш като аргумент.

В случая, в gaka() казваш, че ти трябва дълбочината. Решението е просто - добави в списъка с параметри на функцията още една стойност, $depth.
 
http://sandbox.onlinephpfunctions.com/code/29796661d4fd5832485434e9c474de491d47b711


Ще оставя и кода тука, в случай, че изтече линка.

PHP:
<?php
$array = [
    'one' => 1,
    'two' => [
        'two' => 2,
        'three' => [
            'three' => 3,
            'four' => 4
        ]
    ],
    'three' => 3,
    'four' => [
        'four' => 4,
        'five' => 5,
        'six' => [
            'six' => 6,
            'seven' => [
                'seven' => 7,
                'eight' => 8
            ]
        ]
    ]
    
];


function recursion($arr, $level = 0) {
    echo PHP_EOL . str_repeat("\t", $level);
    printf("Level %d\n", $level);
    
    foreach ( $arr as $k => $v ) {
        
        if ( is_array($v) ) {
            recursion($v, $level+1);
        } else {
            echo str_repeat("\t", $level);
            printf(" - Key: %s | Value: %s\n", $k, $v);
        }
        
    }
}


recursion($array);
 
Добре, да речем, че сортираме масива с ksort($a) рекурсивно:
Код:
Array
(
    [] => Array
        (
            [ar] => Array
                (
                    [0] => 
                    [freesby] => Array
                        (
                            [0] => 
                            [johnson] => 
                            [1] => 
                        )

                    [kenneth] => 
                )

            [3] => 
            [4] => 
            [5] => 
        )

    [1] => Array
        (
            [3] => 
            [4] => 
            [5] => 
        )

)

Сега да обесня за какво точно говоря :twisted:
Резултата от изпълнението на моята горна функция е (респективно) следния:
Код:
-
-ar
0
-freesby
0
johnson
1
kenneth
3
4
5
-1
3
4
5
Затова исках да го ксортна за да добие смисъл резултата от изпълнението на функцията ксорт преди самата рекурсия. Бих искалв аргумента $pass да се задава нещо като:

Код:
[1]Стъпка
-ключ(''=>масив)стойност на $pass=>array(''=>array());
[2]Стъпка
-ключ(''=>array('ar'=>масив))стойност на $pass=>array(''=>array('ar'=>array())); 
[3]Стъпка
-ключ(''=>array('ar'=>array(0=>'')))стойност на $pass=>array(''=>array('ar'=>array(0=>true))); 
[4]Стъпка
-ключ(''=>array('ar'=>array(0=>'', 'freesby'=>масив)))стойност на $pass=>array(''=>array('ar'=>array(0=>true, 'freesby'=>array())));
Т.е. същото като @Revelation само че вместо цифра да блъска масив с ключа и стойност в $pass

Това как би се случило? Защото ползването на цифра като индекс за това на кой ключ се намира дълбочината пренебрегва ключовете стрингове.
 
Нищо не ти разбрах.

Моето беше примерен код, който поиска. Сега изискваш да ти напиша задачата?

Там където се случва рекурсията можеш да вземеш и ключа, няма никаква връзка с това дали е число или стринг.
 
Идеята е $pass да е нещо като мап на извървените стойности в многоизмерен масив 8)
 
Ами дал съм ти цялата нужна информация. Не смятам да ти довършвам задачата.

Опитай се да я завършиш сам.
 
Не разбирам защо се чувстваш задължен. Благодарен съм, че все пак сподели нещо, а пък ако някой наистина може да помогне, нали за това е този форум, а не да се заяждаме ;) :roll:
 
xlebabarov каза:
Не разбирам защо се чувстваш задължен. Благодарен съм, че все пак сподели нещо, а пък ако някой наистина може да помогне, нали за това е този форум, а не да се заяждаме ;) :roll:

1. Колегата ти е дал повече от удачен пример.
2. За какво ти е да имаш карта на масива, когато имаш наличен масива? Къде е логиката в това?
3. Оформи идеята си и ни я разясни просто и с пример какво точно влиза във функцията и искаш да ти връща, като резултат, тя. Не сме гадатели и не хвърляме боб.
4. Никой не се чувства задължен да ти помага, просто го желаем и не е лошо да се обръщаш към колегите с повече уважение, за да получиш културни отговори.
5. Погледни точка (3) !!! :roll:
 
xlebabarov каза:
Не разбирам защо се чувстваш задължен. Благодарен съм, че все пак сподели нещо, а пък ако някой наистина може да помогне, нали за това е този форум, а не да се заяждаме ;) :roll:

Не се чувствам задължен. Изиска пример в темата си, отделих време и ти го написах(което всъщност приключва темата), а след това нахално поиска да ти се напише кода, за който никой си няма на идея какво трябва да прави.

Имам навика да добавям капка заяждане, когато се пита нещо, а автора на темата упорито отказва да даде нормално формулиран въпрос, с нормално формулирани примери.

Това, което даде като пример във второто си питане, за това какво искаш да направиш е объркващо, неразбираемо и неформатирано, и също ти написах, че нищо не се разбра, но ти отказа да опиташ по-подробно и нормално да опишеш проблема ти, а вместо това даде още едно безсмислено мнение, което отново на никой нищо не говори.

И въпреки това, се опитах да ти разбера изискването и колкото повече чета първия ти пост с този след това, изглежда нещата, които искаш са напълно различни.

Ако искаш наистина отговор, е нужно и ти да се постараеш повече. Иначе темата може да стане и 20 страници и отговор пак няма да получиш.
 
http://sandbox.onlinephpfunctions.com/code/be0da1883ca014e8b957187b57ba64dc2bc9917c

Това ли искаш да постигнеш? Ако не, опитай да обясниш подробно.
И какво аджеба трябва да е $pass.
 
Е, явно този форум, както гласят легендите, наистина вече е мъртъв. Освен излишни заяждания човек не може да намери друга информация или помощ. Все пак мерси за отговорите
 
Ами виж се бе човек. 3 пъти те накарах да напишеш подробно какво искаш да постигнеш, защото нищо не се разбира от коментарите ти.
Как да получиш отговор на нещо, което никой не може да разбере? Да гадаем ли?

Дадох ти втори пример, ти даже не ми отговори дали е това, което искаш.

Аман от хлапаци.

Човек да иска да помогне, не може, защото няма един, който да си напише правилно темата и да си зададе въпроса като хората.

И последния ти коментар е просто нагъл предвид дадения код в темата.


Това ми е последен коментар по темата. Няма да се занимавам повече с теб.
 
xlebabarov каза:
Е, явно този форум, както гласят легендите, наистина вече е мъртъв. Освен излишни заяждания човек не може да намери друга информация или помощ. Все пак мерси за отговорите

Първо седни и си формулирай въпроса правилно, след това коментирай. Искаме да ти помогнем, но щом не можеш ти сам да ни обясниш по прост начин какво искаш, то ние как да ти прочетем мислите за да ти отговорим? Ако търсиш помощ тук е мястото, но първо ни обясни какъв ти е проблема, за да получиш адекватен отговор. Формулирай си логиката и ни напиши какво искаш да го правиш този масив!!! :x :shock:
 
Мисля, че съм обеснил достатъчно подробно. Който има необходимите познания и желае да помогне ще го направи. Ако си от неразбиращата група моля не ми оспамвай темата, особенно господина от по предния коментар. СТИГА ЗАЯЖДАНИЯ
 
xlebabarov каза:
Мисля, че съм обединил достатъчно подробно. Който има необходимите познания и желае да помогне ще го направи. Ако си от неразбиращата група моля не ми оспамвай темата, особенно господина от по предния коментар. СТИГА ЗАЯЖДАНИЯ
Абе ти тъп ли си или на такъв се правиш? :!: Нищо не си "обединил" или обяснил. Щом ти изискваме трима човека по-подробно разяснение, то сметни сам колко добре си се представил... Вместо да размиваш темата сам, по-добре да беше обяснил какво искаш. ЗА ПОРЕДЕН коментар ти го казваме, ОБЯСНИ НИ какво искаш да направиш. :evil:
 
Статус
Not open for further replies.

Горе