Re: Static array causing problem in recursion

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2009/12/4 Midhun Girish <midhungirish@xxxxxxxxx>:
> 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 <rquadling@xxxxxxxxxxxxxx>
> wrote:
>>
>> 2009/12/4 Midhun Girish <midhungirish@xxxxxxxxx>:
>> > 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@xxxxxxxxxxxxxx>
>> > wrote:
>> >>
>> >> 2009/12/4 Midhun Girish <midhungirish@xxxxxxxxx>
>> >> >
>> >> > 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



[Index of Archives]     [PHP Home]     [PHP Users]     [PHP Database Programming]     [PHP Install]     [Kernel Newbies]     [Yosemite Forum]     [PHP Books]

  Powered by Linux