问题
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.
回答1:
Wrap them in {}
:
${"file" . $i} = file($filelist[$i]);
Working Example
Using ${}
is a way to create dynamic variables, simple example:
${'a' . 'b'} = 'hello there';
echo $ab; // hello there
回答2:
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.
Case 1 : $$foo['bar']['baz']
- PHP5 interpetation :
${$foo['bar']['baz']}
- PHP7 interpetation :
${$foo}['bar']['baz']
Case 2 : $foo->$bar['baz']
- PHP5 interpetation :
$foo->{$bar['baz']}
- PHP7 interpetation :
$foo->{$bar}['baz']
Case 3 : $foo->$bar['baz']()
- PHP5 interpetation :
$foo->{$bar['baz']}()
- PHP7 interpetation :
$foo->{$bar}['baz']()
Case 4 : Foo::$bar['baz']()
- PHP5 interpetation :
Foo::{$bar['baz']}()
- PHP7 interpetation :
Foo::{$bar}['baz']()
回答3:
Try using {}
instead of ()
:
${"file".$i} = file($filelist[$i]);
回答4:
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.
回答5:
Tom if you have existing array you can convert that array to object and use it like this:
$r = (object) $MyQueryResult;
echo $r->key;
回答6:
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;
}
回答7:
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];
回答8:
Try using {} instead of ():
${"file".$i} = file($filelist[$i]);
来源:https://stackoverflow.com/questions/9257505/using-braces-with-dynamic-variable-names-in-php