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

Posted

技术标签:

【中文标题】在 PHP 中使用带有动态变量名的大括号【英文标题】:Using braces with dynamic variable names in PHP 【发布时间】:2012-03-04 16:14:43 【问题描述】:

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

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


var_dump($file0);

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

【问题讨论】:

不要!从来没有充分的理由使用它们。实际上,它们只是一个杂乱无章的数组。请改用适当的数组。 好吧,对不起,我刚刚回去为我迄今为止提出的每个问题选择了一个答案。好在它只有 7 个:P 还有昆汀,为​​什么他们的做法不好?我认为它们与数组并存一定是有原因的 @user1159454 — 它们杂乱无章,没有可应用于可用数组的所有工具。它们的存在是因为古老的遗产原因和疯狂的边缘案例。 疯狂的边缘情况可能正是有人想问这个问题的原因。 【参考方案1】:

将它们包裹在:

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

Working Example


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

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

【讨论】:

是否也可以用同样的逻辑创建动态数组? 我对@dtakis 有同样的疑问,你能帮帮我们吗?如果可能,请查看this question。 如果您使用它来包含变量(恕我直言,这是最有用的方式),请发出警告,不要忘记使用双引号。 $'fixedTime$i' = $row['timeInstance']; 给你一个不是很有用的$fixedTime$i 而不是$fixedTime1, $fixedTime2 等。(幸运的是几乎马上就发现了它。)【参考方案2】:

概述

php 中,你可以在变量前面多加一个$ 使其成为动态变量:

$$variableName = $value;

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

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

您可以但不强制将$variableName 放在 之间:

$$variableName = $value;

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

$$variableNamePart1 . $variableNamePart2 = $value;

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

PHP5 和 PHP7 的区别

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

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

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

PHP5 解析:$$foo['bar']['baz'] PHP7 解析:$$foo['bar']['baz']

案例2:$foo-&gt;$bar['baz']

PHP5 解析:$foo-&gt;$bar['baz'] PHP7 解析:$foo-&gt;$bar['baz']

案例3:$foo-&gt;$bar['baz']()

PHP5 解析:$foo-&gt;$bar['baz']() PHP7 解析:$foo-&gt;$bar['baz']()

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

PHP5 解析:Foo::$bar['baz']() PHP7 解析:Foo::$bar['baz']()

【讨论】:

一个可疑话题的好答案。我真的很高兴我不必调试这样的代码。 最佳答案,因为它只是回答问题而没有判断性 是的,我们也遇到了一些遗留代码的问题。生产环境是 PHP5.5,开发环境是 PHP7。我喜欢这个问题。【参考方案3】:

尝试使用 而不是()

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

【讨论】:

来自phpNET手册php.net/manual/ru/language.variables.variable.php$price_for_monday = 10; $price_for_tuesday = 20; $today = 'tuesday'; $price_for_today = $ 'price_for_' . $today; echo $price_for_today; // will return 20 【参考方案4】:

我经常对查询返回的结果执行此操作..

例如

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

foreach ($MyQueryResult as $key=>$value)

   $$key=$value;

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

是的,这可能是懒惰,但我从来没有遇到过任何问题。

【讨论】:

你试过使用 PHP 的 extract() 函数吗? php.net/manual/en/function.extract.php 用于数据库结果集的便捷单行:foreach($row as $k=>$v)$$k=$v【参考方案5】:

Tom 如果您有现有数组,您可以将该数组转换为对象并像这样使用它:

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

【讨论】:

【参考方案6】:

尝试使用 而不是 ():

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

我处于一个有 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];

【讨论】:

以上是关于在 PHP 中使用带有动态变量名的大括号的主要内容,如果未能解决你的问题,请参考以下文章

循环语句中表名的动态变量

Python中使用动态变量名的方法

Python中使用动态变量名的方法

在 django 中加载带有变量名的静态文件

函数名的使用

函数名的使用