30

Lets say I have a variable called $file and the for loop: for($i=1; $i <= 5; $i++) {}

For each iteration of the for loop, the $i value will be appended to the $file variable name so after the for loop ends, I should have five variables: $file1, $file2, $file3, $file4, and $file5.

1
  • 4
    Why do you want to do this? Using an (associative) array as a portable namespace is almost always a better solution. Commented Jun 4, 2011 at 5:16

5 Answers 5

74

Use ${'varname'} syntax:

for($i=1; $i <= 5; $i++) {
    ${'file' . $i} = $i;
}

However, it's often better to use arrays instead of this.

Sign up to request clarification or add additional context in comments.

2 Comments

@Yuri Thank you so much! Even in 2014 your answer is helping people!
Arrays for what I am doing won't help, I am making a file line by line so I have $line01="foo"....$line55="bar" so doing this variable variable method seems to make the most sense for me, unless there is a better way in creating the line by lines? So. how do I had the 0 padding on 01-09 as well? I suppose an if statement within the for loop but is there a better way?
16

There is a way to do this:

for($i = 1; $i <= 5; $i++) {
    ${'file'.$i} = ...;
}

But it is a bad idea to do this. Why is it a bad idea? Because this is what arrays are meant for. Do this instead:

for($i = 1; $i <= 5; $i++) {
    $file[$i] = ...;
}

(NB. It is the usual convention to start array keys at 0 rather than 1, but you do not have to do so.)

Comments

4

it is possible to do what you want, but creating variables on the fly seems an unusual way to solve a problem like this (i could be wrong)

I would suggest storing the filenames in an array, that way you can easily iterate over the files later on, or add an extra file and not have to change any hardcoded variable names

    $myfiles = array();

    for ($i=1; $i<=5; $i++) {
       $myfiles["file$i"] = "value set in loop";
    }

    //if you want to use the values later
    $file5_value = $myfiles["file5"];

    //if you want to loop through them all
    foreach ($myfiles as $key => $val) {
      echo "$key -> $val\n";
    }

Comments

3

You can use an array as well. It doesn't have the same exact affect, but it is generally what I see used in these situations.

for($i=1; $i <= 5; $i++) {
    $file[$i] = $i;
}

Comments

1

See PHP's manual on Variable Variables.

$var_name = '';
for ($i = 0; $i < 5; $i++)
{
  $var_name = 'file' . $i;

  // reference $$var_name now.
  $$var_name = 'foo';
}

var_dump($file1);
var_dump($file2);
var_dump($file3);
var_dump($file4);
var_dump($file5);

demo

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.