- [PHP][Recursion]Извеждане на текущото ниво
123
WT форуми -> PHP MySQL ASP.NET -> [PHP][Recursion]Извеждане на текущото ниво
Създайте нова тема Тази тема е заключена - не можеш да отговаряте или да променяте мнения 
Автор Съобщение
xlebabarov
Нов
Нов

Регистриран на: 10/11/2009 8:24 am

Support: 5
Bonus: 10
Мнения: 184
Мнение 21/06/2019 7:12 pm     [PHP][Recursion]Извеждане на текущото ниво Отговорете с цитат


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

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

Но как да изведем в кое ниво се намира изпълнението на рекурсивната функция за всеки ключ? Crying or Very sad
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 57
Bonus: 114
Мнения: 772
Мнение 21/06/2019 8:13 pm      Отговорете с цитат


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

Регистриран на: 10/11/2009 8:24 am

Support: 5
Bonus: 10
Мнения: 184
Мнение 22/06/2019 8:12 am      Отговорете с цитат


А може ли някакъв примерен код
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
anonimen
Активен
Активен

Регистриран на: 11/06/2012 8:07 pm

Support: 161
Bonus: 321
Мнения: 1512
Мнение 22/06/2019 12:06 pm      Отговорете с цитат


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

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

Регистриран на: 24/03/2013 3:23 pm

Support: 57
Bonus: 114
Мнения: 772
Мнение 22/06/2019 12:54 pm      Отговорете с цитат


http://sandbox.onlinephpfunctions.com/code/29796661d4fd5832485434e9c474de491d47b711


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

PHP code:

<?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);
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
xlebabarov
Нов
Нов

Регистриран на: 10/11/2009 8:24 am

Support: 5
Bonus: 10
Мнения: 184
Мнение 22/06/2019 11:25 pm      Отговорете с цитат


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

Array
(
    [] => Array
        (
            [ar] => Array
                (
                    [0] =>
                    [freesby] => Array
                        (
                            [0] =>
                            [johnson] =>
                            [1] =>
                        )

                    [kenneth] =>
                )

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

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

)


Сега да обесня за какво точно говоря Twisted Evil
Резултата от изпълнението на моята горна функция е (респективно) следния:
-
-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

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

Регистриран на: 24/03/2013 3:23 pm

Support: 57
Bonus: 114
Мнения: 772
Мнение 23/06/2019 1:15 am      Отговорете с цитат


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

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

Там където се случва рекурсията можеш да вземеш и ключа, няма никаква връзка с това дали е число или стринг.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 141
Мнение 24/06/2019 2:40 pm      Отговорете с цитат


Само аз ли не мога да намеря никакъв смисъл в тоя код? Sad
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 57
Bonus: 114
Мнения: 772
Мнение 24/06/2019 9:48 pm      Отговорете с цитат


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


Ам... не. Sad
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
xlebabarov
Нов
Нов

Регистриран на: 10/11/2009 8:24 am

Support: 5
Bonus: 10
Мнения: 184
Мнение 25/06/2019 9:13 pm      Отговорете с цитат


Идеята е $pass да е нещо като мап на извървените стойности в многоизмерен масив Cool
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 57
Bonus: 114
Мнения: 772
Мнение 26/06/2019 8:48 am      Отговорете с цитат


Ами дал съм ти цялата нужна информация. Не смятам да ти довършвам задачата.

Опитай се да я завършиш сам.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
xlebabarov
Нов
Нов

Регистриран на: 10/11/2009 8:24 am

Support: 5
Bonus: 10
Мнения: 184
Мнение 26/06/2019 12:38 pm      Отговорете с цитат


Не разбирам защо се чувстваш задължен. Благодарен съм, че все пак сподели нещо, а пък ако някой наистина може да помогне, нали за това е този форум, а не да се заяждаме Wink Rolling Eyes
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Тази тема е заключена - не можеш да отговаряте или да променяте мнения    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
123
Страница 1 от 3


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети