Re: Static array causing problem in recursion

Richard Quadling <[email protected]>
Newsgroups gmane.comp.php.windows
Message-ID <[email protected]>
2009/12/4 Midhun Girish <[email protected]>:
> hello all,
>
> hey Richard Quadling you are right... sorry man.. i just noticed that just
> now.
>
> Actually i missed th line self::getAllChildren($child,$levelcount,False);
> that you gave and thought it was a mistake...that y i updated the
> script...you can imagine the condition of a person who searched over 250
> pages in internet for this.. :)....i haven't updated the pages yet.... thank
> you for the heads up.. i will take it as you gave...
>
>
> Midhun Girish
>
>
>
> On Fri, Dec 4, 2009 at 5:48 PM, Richard Quadling <[email protected]>
> wrote:
>>
>> 2009/12/4 Midhun Girish <[email protected]>:
>> > 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
>> > <[email protected]>
>> > wrote:
>> >>
>> >> 2009/12/4 Midhun Girish <[email protected]>
>> >> >
>> >> > 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 :
>> >> 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
>
>

You really only needed 1 page ...

http://www.php.net/manual/en/language.variables.scope.php#language.variables.scope.static

Good luck!
-- 
-----
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

-- 
PHP Windows Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.