Jump to content

php can't increment++ in recursion?


somenewbie

Recommended Posts

hello everyone,

 

i made a function that will check if a file with specific name already exists in a directory and if not it will keep on looking for the next possible name by adding incremented number to the end of the name. and i believe that i found a bug in php but did not want to report it before having someone else checked too

 

i used recursion

function header: fetch_next_freefile($where,$name,$num=0) -where is the location of the file, name is the name and num keeps incrementing while checking for next unused filename

 

however,

when i call the function recursively (inside definition) like this:

fetch_next_freefile($where,$name,$num++) -it doesn't work. it will reset connection on loading instead

 

when i call the function recursively like this:

fetch_next_freefile($where,$name,($num+1)) -it will work

 

does anybody know why? can someone try my function out?

 

version that will work:

function fetch_next_freefile($where,$name,$num=0){
  $basename=substr($name, 0, strrpos($name, '.') );
  $extension=substr($name, strrpos($name, '.') );
  
  $checkme=false;
  if($num==0){
    if(is_file($where.$basename.$extension)){
      $checkme=true;
    }
  }else{
    $checkme=true;
  }
  
  if($checkme){
    if(is_file($where.$basename.$num.$extension)){
      return fetch_next_freefile($where,$name,($num+1));
    }else{
      return($where.$basename.$num.$extension);
    }
  }else{
    return $name;
  }
}

echo(fetch_next_freefile('..directory where file is located..','file name'));

 

version that won't work:

function fetch_next_freefile($where,$name,$num=0){
  $basename=substr($name, 0, strrpos($name, '.') );
  $extension=substr($name, strrpos($name, '.') );
  
  $checkme=false;
  if($num==0){
    if(is_file($where.$basename.$extension)){
      $checkme=true;
    }
  }else{
    $checkme=true;
  }
  
  if($checkme){
    if(is_file($where.$basename.$num.$extension)){
      return fetch_next_freefile($where,$name,$num++);
    }else{
      return($where.$basename.$num.$extension);
    }
  }else{
    return $name;
  }
}

echo(fetch_next_freefile('..directory where file is located..','file name'));

 

of course, check for a file that exists in your directory, and the following one as well, so it would go into recursion. so for example, have two files called "a.jpg" and "a0.jpg" in a directory and check for file "a.jpg"

Link to comment
Share on other sites

You have to know how "++" works. When it is after a variable, $i++, the variable is used then incremented. When it is before the variable, ++$i, the variable is incremented then used.

 

You can see this in this example:

<?php
$n = 1;
echo '$n++ = ' . $n++ . "<br>\n ";
echo '$n = ' . $n . "<br>\n";

$m = 1;
echo '++$m = ' . ++$m . "<br>\n";
echo '$m = ' . $m . "<br>\n";
?>

 

Ken

Link to comment
Share on other sites

I think a while loop instead of recursion in this case would make more sense, but that's just me.

 

Try ++$num for the thing your question was about. Although Ken beat me to the punch.

Link to comment
Share on other sites

Let me explain this way.

 

$n = 0;

echo $n++; // 0 = echo $n then increment the number.
echo $n; //1 = echo $n
echo ++$n; // 2 = echo $n AFTER incrementing the number.

 

Durn Ken beats everyone to the punch.

Link to comment
Share on other sites

oooooooh, damn. i totally forgot about that. so like that it would just keep running in loop..

 

thanks for the answers people

 

edit: if anyone wanted to use that function feel free to do so but i forgot a little thing, in one of the cases it should return

      ($basename.$num.$extension);

not

      ($where.$basename.$num.$extension);

Link to comment
Share on other sites

  • 2 weeks later...
This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.