Using braces with dynamic variable names in PHP
PhpVariablesDynamicDynamic VariablesPhp Problem Overview
I'm trying to use dynamic variable names (I'm not sure what they're actually called) But pretty much like this:
for($i=0; $i<=2; $i++) {
$("file" . $i) = file($filelist[$i]);
}
var_dump($file0);
The return is null
which tells me it's not working. I have no idea what the syntax or the technique I'm looking for is here, which makes it hard to research. $filelist
is defined earlier on.
Php Solutions
Solution 1 - Php
Wrap them in {}
:
${"file" . $i} = file($filelist[$i]);
Using ${}
is a way to create dynamic variables, simple example:
${'a' . 'b'} = 'hello there';
echo $ab; // hello there
Solution 2 - Php
Overview
In PHP, you can just put an extra $
in front of a variable to make it a dynamic variable :
$$variableName = $value;
While I wouldn't recommend it, you could even chain this behavior :
$$$$$$$$DoNotTryThisAtHomeKids = $value;
You can but are not forced to put $variableName
between {}
:
${$variableName} = $value;
Using {}
is only mandatory when the name of your variable is itself a composition of multiple values, like this :
${$variableNamePart1 . $variableNamePart2} = $value;
It is nevertheless recommended to always use {}
, because it's more readable.
Differences between PHP5 and PHP7
Another reason to always use {}
, is that PHP5 and PHP7 have a slightly different way of dealing with dynamic variables, which results in a different outcome in some cases.
In PHP7, dynamic variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the mix of special cases in PHP5. The examples below show how the order of evaluation has changed.
$$foo['bar']['baz']
Case 1 : - PHP5 interpetation :
${$foo['bar']['baz']}
- PHP7 interpetation :
${$foo}['bar']['baz']
$foo->$bar['baz']
Case 2 : - PHP5 interpetation :
$foo->{$bar['baz']}
- PHP7 interpetation :
$foo->{$bar}['baz']
$foo->$bar['baz']()
Case 3 : - PHP5 interpetation :
$foo->{$bar['baz']}()
- PHP7 interpetation :
$foo->{$bar}['baz']()
Foo::$bar['baz']()
Case 4 : - PHP5 interpetation :
Foo::{$bar['baz']}()
- PHP7 interpetation :
Foo::{$bar}['baz']()
Solution 3 - Php
Try using {}
instead of ()
:
${"file".$i} = file($filelist[$i]);
Solution 4 - Php
I do this quite often on results returned from a query..
e.g.
// $MyQueryResult is an array of results from a query
foreach ($MyQueryResult as $key=>$value)
{
${$key}=$value;
}
Now I can just use $MyFieldname (which is easier in echo statements etc) rather than $MyQueryResult['MyFieldname']
Yep, it's probably lazy, but I've never had any problems.
Solution 5 - Php
Tom if you have existing array you can convert that array to object and use it like this:
$r = (object) $MyQueryResult;
echo $r->key;
Solution 6 - Php
Try using {} instead of ():
${"file".$i} = file($filelist[$i]);
Solution 7 - Php
i have a solution for dynamically created variable value and combined all value in a variable.
if($_SERVER['REQUEST_METHOD']=='POST'){
$r=0;
for($i=1; $i<=4; $i++){
$a = $_POST['a'.$i];
$r .= $a;
}
echo $r;
}
Solution 8 - Php
I was in a position where I had 6 identical arrays and I needed to pick the right one depending on another variable and then assign values to it. In the case shown here $comp_cat was 'a' so I needed to pick my 'a' array ( I also of course had 'b' to 'f' arrays)
Note that the values for the position of the variable in the array go after the closing brace. > ${'comp_cat_'.$comp_cat.'arr'}[1][0] = "FRED BLOGGS"; > > ${'comp_cat'.$comp_cat.'_arr'}[1][1] = $file_tidy; > > echo 'First array value is '.$comp_cat_a_arr[1][0].' and the second value is .$comp_cat_a_arr[1][1];