在PHP中使用带有动态变量名的大括号

时间:2012-02-13 08:32:55

标签: php variables dynamic dynamic-variables

我正在尝试使用动态变量名称(我不确定它们实际上是什么名称)但是非常像这样:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

返回null,告诉我它不起作用。我不知道我正在寻找的语法或技术是什么,这使得研究变得困难。 $filelist之前已定义。

8 个答案:

答案 0 :(得分:460)

将它们包裹在{}

${"file" . $i} = file($filelist[$i]);

Working Example


使用${}是一种创建动态变量的方法,简单示例:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

答案 1 :(得分:69)

概述

在PHP中,您可以在变量前添加额外的$以使其成为动态变量:

$$variableName = $value;

虽然我不推荐它,但你甚至可以链接这种行为:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

您可以但不必强制将$variableName放在{}

之间
${$variableName} = $value;

仅当变量名称本身是多个值的组合时才使用{},如下所示:

${$variableNamePart1 . $variableNamePart2} = $value;

但建议始终使用{},因为它更具可读性。

PHP5和PHP7之间的差异

始终使用{}的另一个原因是,PHP5和PHP7处理动态变量的方式略有不同,在某些情况下会导致不同的结果。

在PHP7中,动态变量,属性和方法现在将严格按照从左到右的顺序进行评估,而不是PHP5中特殊情况的混合。以下示例显示了评估顺序的变化情况。

案例1:$$foo['bar']['baz']

  • PHP5 interpetation:${$foo['bar']['baz']}
  • PHP7 interpetation:${$foo}['bar']['baz']

案例2:$foo->$bar['baz']

  • PHP5 interpetation:$foo->{$bar['baz']}
  • PHP7 interpetation:$foo->{$bar}['baz']

案例3:$foo->$bar['baz']()

  • PHP5 interpetation:$foo->{$bar['baz']}()
  • PHP7 interpetation:$foo->{$bar}['baz']()

案例4:Foo::$bar['baz']()

  • PHP5 interpetation:Foo::{$bar['baz']}()
  • PHP7 interpetation:Foo::{$bar}['baz']()

答案 2 :(得分:20)

尝试使用{}代替()

${"file".$i} = file($filelist[$i]);

答案 3 :(得分:4)

我经常在查询返回的结果中这样做。

e.g。

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

现在我可以使用$ MyFieldname(这在echo语句中比较容易)而不是$ MyQueryResult ['MyFieldname']

是的,它可能很懒,但我从来没有遇到任何问题。

答案 4 :(得分:2)

Tom如果你有现有的数组,你可以将该数组转换为object并使用它:

$r = (object) $MyQueryResult;
echo $r->key;

答案 5 :(得分:0)

我有一个动态创建变量值的解决方案,并将所有值组合在一个变量中。

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

答案 6 :(得分:0)

我处于一个我有6个相同数组的位置,我需要根据另一个变量选择正确的数组然后为其赋值。在这里显示的情况下,$ comp_cat是'a'所以我需要选择我的'a'数组(我当然也有'b'到'f'数组)

请注意,数组中变量位置的值位于右括号之后。

  

$ {'comp_cat _'。$ comp_cat .'_ arr'} [1] [0] =“FRED BLOGGS”;

     

$ {'comp_cat _'。$ comp_cat .'_ arr'} [1] [1] = $ file_tidy;

     

echo'第一个数组值是'。$ comp_cat_a_arr [1] [0]。'第二个值是。$ comp_cat_a_arr [1] [1];

答案 7 :(得分:0)

尝试使用{}代替():

reload