在 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->$bar['baz']
PHP5 解析:$foo->$bar['baz']
PHP7 解析:$foo->$bar['baz']
案例3:$foo->$bar['baz']()
PHP5 解析:$foo->$bar['baz']()
PHP7 解析:$foo->$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 中使用带有动态变量名的大括号的主要内容,如果未能解决你的问题,请参考以下文章