Re: Static array causing problem in recursion
| From: | Richard Quadling | Date: | Fri, 04 Dec 2009 12:18:20 +0000 |
| Subject: | Re: Static array causing problem in recursion | ||
| References: | 1 2 3 | Groups: | php.windows |
| Request: | Send a blank email to php-windows+get-29745@lists.php.net to get a copy of this message | ||
2009/12/4 Midhun Girish <midhungirish@gmail.com>:
> Hello ,
>
> Richard Quadling thank you so much.. your trick worked... :) now its
> working.. heres the modified code...
>
> public function getAllChildren($node,$level,$firstCall=false)
>>
>> {
>> static $rootsarray=array();
>> static $levelcount;
>> if($firstCall) {
>> $rootsarray=array();
>> }
>> $levelcount=$level;
>> $child=self::getChild($node);
>> if($child==''||$levelcount==0)
>> {
>> return 1;
>> }
>> else
>> {
>> $levelcount--;
>> $rootsarray[]=$child;
>> self::getAllChildren($child,$levelcount,False);
>> }
>> return $rootsarray;
>>
>> }
>>
>
> and i call the function like :
>
> $nodearray=tree::getAllChildren('W1',10,true);
>
>
> Thank you so much for your support...
>
> Midhun Girish
>
>
> On Fri, Dec 4, 2009 at 3:18 PM, Richard Quadling <rquadling@googlemail.com>
> wrote:
>>
>> 2009/12/4 Midhun Girish <midhungirish@gmail.com>
>> >
>> > Hello guys,
>> > I was trying to use a recursive function to do a tree traversal.. i used
>> > a
>> > static array to store the nodes at each recursion.. The function works
>> > correctly if it is called only once during an execution.. but when i
>> > call it
>> > twice or more, the nodes get appended to the array...hers the var dump
>> > of
>> > the array...
>> > Three:Array ( [0] => W4 )
>> > Two:Array ( [0] => W4 [1] => W3 [2] => W4 )
>> > One:Array ( [0] => W4 [1] => W3 [2] => W4 [3] => W2 [4] => W3 [5] =>
>> > W4
>> > )
>> >
>> > I tried to reset() the array and all but not working..i am not able to
>> > chnage the index of the $rootsarray back to 0... the new elelnts are
>> > added
>> > at the end only...can anyone give me a push in the right direction?? Im
>> > using PHP Version 5.2.9 in XAMPP... Hers the source...
>> >
>> > public function getAllChildren($node,$level)
>> > {
>> > static $rootsarray=array();
>> > static $levelcount;
>> > $levelcount=$level;
>> > $child=self::getChild($node);
>> > if($child==''||$levelcount==0)
>> > {
>> > return 1;
>> > }
>> > else
>> > {
>> > $levelcount--;
>> > $rootsarray[]=$child;
>> > self::getAllChildren($child,$levelcount);
>> > }
>> > return $rootsarray;
>> >
>> > }
>> >
>> > Midhun Girish
>>
>> Of course. The array is static. So the content is maintained between
>> calls.
>>
>> You need to know when to initialize it.
>>
>> Something like ...
>>
>> public function getAllChildren($node,$level,$firstCall=True)
>> {
>> static $rootsarray=array();
>> static $levelcount;
>> if($firstCall) {
>> $rootsarray=array();
>> }
>> $levelcount=$level;
>> $child=self::getChild($node);
>> if($child==''||$levelcount==0)
>> {
>> return 1;
>> }
>> else
>> {
>> $levelcount--;
>> $rootsarray[]=$child;
>> self::getAllChildren($child,$levelcount,False);
>> }
>> return $rootsarray;
>>
>> }
>>
>>
>> --
>> -----
>> Richard Quadling
>> "Standing on the shoulders of some very clever giants!"
>> EE : http://www.experts-exchange.com/M_248814.html
>> Zend Certified Engineer : ¡ȒpßÜ)€ycA.Ag
>> http://zend.com/zce.php?c=ZEND002498&r=213474731
>> ZOPA : http://uk.zopa.com/member/RQuadling
>
>
Why did you change the default to False? This now requires _ALL_ calls
to the method to be amended.
Unless you wanted to preserve the incorrect behaviour...
Hmmm. BC is a PITA.
--
-----
Richard Quadling
"Standing on the shoulders of some very clever giants!"
EE : http://www.experts-exchange.com/M_248814.html
Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731
ZOPA : http://uk.zopa.com/member/RQuadling