Re: [PHP] Recursion... Sort of...

[email protected] ("Nathan Nobbe")
Newsgroups php.general
Message-ID <[email protected]>
On Thu, May 8, 2008 at 6:23 PM, Jim Lucas <[email protected]> wrote:

> Nathan Nobbe wrote:
>
>> On Thu, May 8, 2008 at 3:48 PM, Matt Neimeyer <[email protected]> wrote:
>>
>>  Is there a way to tell if a function has been called that has resulted
>>> in a call to the same function?
>>>
>>> We have an in-house CRM app that has a function that draws a tabbed
>>> panel on a screen... BUT if there are sub-sub-tabbed panels we want to
>>> invert the tab colors and panel colors...
>>>
>>> So...
>>>
>>> DrawSubTab($Set) - Black on White
>>>  Content
>>>  DrawSubTab($Set) - White on Black
>>>     Content
>>>     DrawSubTab($Set) - Black on White
>>>        Content
>>>     DrawSubTab($Set) - Black on White
>>>        Content
>>>        Etc...
>>>
>>> I suppose I could rewrite EVERY call to the function with a recursion
>>> count like DrawSubTab($Set,$DepthCount+1) but that would be a MASSIVE
>>> commit... whereas if the function can determine itself... All that
>>> said I can't think of a good way to do it without a bastardized global
>>> variable that track "how deep" we are and there is something that
>>> bothers me about that approach... Unless that really is the easiest
>>> way.
>>>
>>
>>
>> you dont need a global, you can have a variable that persists throughout
>> the
>> request local only to the function itself using the static keyword.
>>
>> function doStuff() {
>>  static $callCount;
>>
>>  if(!isset($callCount))
>>   $callCount = 1;
>>  else
>>    $callCount++;
>>
>>  /// do stuff w/ $callCount to potentially handle sub-tabs and stuff
>>
>>  $callCount--;
>> }
>>
>> -nathan
>>
>>
> Look at the way he wants it to work.  Your way would change alternate the
> color each time the function is called.  I think the best/easiest way to
> keep track of depth will be by passing a variable in the function call
> itself.


actually, i didnt supply the part where he does what he wants with the
depth.  i merely provided a way to track it without using a global
variable.  he could easily do something specific depending upon the depth
with what ive shown.

<?php
function doStuff() {
 static $callCount;

 if(!isset($callCount))
  $callCount = 1;
 else
   $callCount++;

 /// do stuff w/ $callCount to potentially handle sub-tabs and stuff
    if($callCount == 2) {
      echo 'white on black';
    } else {
      echo 'black on white';
    }
    echo PHP_EOL;
}

doStuff();
doStuff();
doStuff();
doStuff();
doStuff();
?>

nathan-nobbes-macbook-pro:~ nnobbe$ php testDepth.php
black on white
white on black
black on white
black on white
black on white

o ya and removed the part where the variable is decremented from the
original ;)  (good call there jim) i was thinking the function was going to
be called recursively at first which is why i had it in there and it would
make sense in that case; however since it isnt going to be called
recursively it doesnt.

-nathan
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.