|
Автор |
Съобщение |
Нов
Регистриран на: 10/11/2009 8:24 am
Support:
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
| | |
Но как да изведем в кое ниво се намира изпълнението на рекурсивната функция за всеки ключ?  |
|
Върнете се в началото |
|
|
Потребител
Регистриран на: 24/03/2013 3:23 pm
Support:
Bonus: 114
Мнения: 772
|
21/06/2019 8:13 pm
|
|
|
Ползвай брояч и подавай референция към този брояч всеки път като влезеш в рекурсия.
|
|
Върнете се в началото |
|
|
Нов
Регистриран на: 10/11/2009 8:24 am
Support:
Bonus: 10
Мнения: 184
|
22/06/2019 8:12 am
|
|
|
А може ли някакъв примерен код
|
|
Върнете се в началото |
|
|
Активен
Регистриран на: 11/06/2012 8:07 pm
Support:
Bonus: 321
Мнения: 1512
|
22/06/2019 12:06 pm
|
|
|
Най-естественото нещо, което можеш да направиш, когато ти трябва някаква стойност във функция, е да я приемеш като аргумент.
В случая, в gaka() казваш, че ти трябва дълбочината. Решението е просто - добави в списъка с параметри на функцията още една стойност, $depth.
|
|
Върнете се в началото |
|
|
Потребител
Регистриран на: 24/03/2013 3:23 pm
Support:
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);
|
|
Върнете се в началото |
|
|
Нов
Регистриран на: 10/11/2009 8:24 am
Support:
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] => )
)
| | |
Сега да обесня за какво точно говоря Резултата от изпълнението на моята горна функция е (респективно) следния: |
| - -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 Това как би се случило? Защото ползването на цифра като индекс за това на кой ключ се намира дълбочината пренебрегва ключовете стрингове. |
|
Върнете се в началото |
|
|
Потребител
Регистриран на: 24/03/2013 3:23 pm
Support:
Bonus: 114
Мнения: 772
|
23/06/2019 1:15 am
|
|
|
Нищо не ти разбрах.
Моето беше примерен код, който поиска. Сега изискваш да ти напиша задачата?
Там където се случва рекурсията можеш да вземеш и ключа, няма никаква връзка с това дали е число или стринг.
|
|
Върнете се в началото |
|
|
Нов
Регистриран на: 08/10/2016 4:31 pm
Support:
Bonus: 12
Мнения: 141
|
|
Върнете се в началото |
|
|
Потребител
Регистриран на: 24/03/2013 3:23 pm
Support:
Bonus: 114
Мнения: 772
|
24/06/2019 9:48 pm
|
|
|
pix3l написа: | Само аз ли не мога да намеря никакъв смисъл в тоя код?  |
Ам... не.  |
|
Върнете се в началото |
|
|
Нов
Регистриран на: 10/11/2009 8:24 am
Support:
Bonus: 10
Мнения: 184
|
|
Върнете се в началото |
|
|
Потребител
Регистриран на: 24/03/2013 3:23 pm
Support:
Bonus: 114
Мнения: 772
|
26/06/2019 8:48 am
|
|
|
Ами дал съм ти цялата нужна информация. Не смятам да ти довършвам задачата.
Опитай се да я завършиш сам.
|
|
Върнете се в началото |
|
|
Нов
Регистриран на: 10/11/2009 8:24 am
Support:
Bonus: 10
Мнения: 184
|
|
Върнете се в началото |
|
|
|