Using braces with dynamic variable names in PHP

PhpVariablesDynamicDynamic Variables

Php 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]);

###Working Example


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.

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']()

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];

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1159454View Question on Stackoverflow
Solution 1 - PhpSarfrazView Answer on Stackoverflow
Solution 2 - PhpJohn SlegersView Answer on Stackoverflow
Solution 3 - PhpJoakim JohanssonView Answer on Stackoverflow
Solution 4 - PhpTomView Answer on Stackoverflow
Solution 5 - PhpcorysusView Answer on Stackoverflow
Solution 6 - PhpVildan BinaView Answer on Stackoverflow
Solution 7 - PhpMuradView Answer on Stackoverflow
Solution 8 - PhpM61VulcanView Answer on Stackoverflow