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

C++ JAVA
User avatar
xlebabarov
Нов
Нов
Posts: 186
Joined: Tue Nov 10, 2009 6:24 am

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

Post by xlebabarov » Fri Jun 21, 2019 5:12 pm

Здравейте, да предположим, че имаме следния масив:

Code: Select all

Array
(
    [] => Array
        (
            [3] => 
            [4] => 
            [5] => 
            [ar] => Array
                (
                    [0] => 
                    [kenneth] => 
                    [freesby] => Array
                        (
                            [0] => 
                            [1] => 
                            [johnson] => 
                        )

                )

        )

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

)
Когато изпълняваме следната функция с рекурсия:

Code: Select all

 $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"; }
	}	
}
Получаваме:

Code: Select all

-
-ar
0
-freesby
0
johnson
1
kenneth
3
4
5
-1
3
4
5
Но как да изведем в кое ниво се намира изпълнението на рекурсивната функция за всеки ключ? :cry:

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Fri Jun 21, 2019 6:13 pm

Ползвай брояч и подавай референция към този брояч всеки път като влезеш в рекурсия.

User avatar
xlebabarov
Нов
Нов
Posts: 186
Joined: Tue Nov 10, 2009 6:24 am

Post by xlebabarov » Sat Jun 22, 2019 6:12 am

А може ли някакъв примерен код
Гошо пича ;) Понякога питам въпросчета с повишена трудност, но какво да се прави :)

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1574
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Sat Jun 22, 2019 10:06 am

Най-естественото нещо, което можеш да направиш, когато ти трябва някаква стойност във функция, е да я приемеш като аргумент.

В случая, в gaka() казваш, че ти трябва дълбочината. Решението е просто - добави в списъка с параметри на функцията още една стойност, $depth.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Sat Jun 22, 2019 10:54 am

http://sandbox.onlinephpfunctions.com/c ... 491d47b711


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

[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);
[/php]

User avatar
xlebabarov
Нов
Нов
Posts: 186
Joined: Tue Nov 10, 2009 6:24 am

Post by xlebabarov » Sat Jun 22, 2019 9:25 pm

Добре, да речем, че сортираме масива с ksort($a) рекурсивно:

Code: Select all

Array
&#40;
    &#91;&#93; => Array
        &#40;
            &#91;ar&#93; => Array
                &#40;
                    &#91;0&#93; => 
                    &#91;freesby&#93; => Array
                        &#40;
                            &#91;0&#93; => 
                            &#91;johnson&#93; => 
                            &#91;1&#93; => 
                        &#41;

                    &#91;kenneth&#93; => 
                &#41;

            &#91;3&#93; => 
            &#91;4&#93; => 
            &#91;5&#93; => 
        &#41;

    &#91;1&#93; => Array
        &#40;
            &#91;3&#93; => 
            &#91;4&#93; => 
            &#91;5&#93; => 
        &#41;

&#41;
Сега да обесня за какво точно говоря :twisted:
Резултата от изпълнението на моята горна функция е (респективно) следния:

Code: Select all

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

Code: Select all

&#91;1&#93;Стъпка
-ключ&#40;''=>масив&#41;стойност на $pass=>array&#40;''=>array&#40;&#41;&#41;;
&#91;2&#93;Стъпка
-ключ&#40;''=>array&#40;'ar'=>масив&#41;&#41;стойност на $pass=>array&#40;''=>array&#40;'ar'=>array&#40;&#41;&#41;&#41;; 
&#91;3&#93;Стъпка
-ключ&#40;''=>array&#40;'ar'=>array&#40;0=>''&#41;&#41;&#41;стойност на $pass=>array&#40;''=>array&#40;'ar'=>array&#40;0=>true&#41;&#41;&#41;; 
&#91;4&#93;Стъпка
-ключ&#40;''=>array&#40;'ar'=>array&#40;0=>'', 'freesby'=>масив&#41;&#41;&#41;стойност на $pass=>array&#40;''=>array&#40;'ar'=>array&#40;0=>true, 'freesby'=>array&#40;&#41;&#41;&#41;&#41;; 
Т.е. същото като @Revelation само че вместо цифра да блъска масив с ключа и стойност в $pass

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

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Sat Jun 22, 2019 11:15 pm

Нищо не ти разбрах.

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

Там където се случва рекурсията можеш да вземеш и ключа, няма никаква връзка с това дали е число или стринг.

pix3l
Нов
Нов
Posts: 161
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Mon Jun 24, 2019 12:40 pm

Само аз ли не мога да намеря никакъв смисъл в тоя код? :(

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

Post by Revelation » Mon Jun 24, 2019 7:48 pm

pix3l wrote:Само аз ли не мога да намеря никакъв смисъл в тоя код? :(
Ам... не. :(

User avatar
xlebabarov
Нов
Нов
Posts: 186
Joined: Tue Nov 10, 2009 6:24 am

Post by xlebabarov » Tue Jun 25, 2019 7:13 pm

Идеята е $pass да е нещо като мап на извървените стойности в многоизмерен масив 8)
Гошо пича ;) Понякога питам въпросчета с повишена трудност, но какво да се прави :)

Locked