0
$arr[0]=123;
$a="arr[0]";
echo $$a;

给我错误

注意:未定义变量:arr[0]

在最后一行。

我应该怎么做才能让它工作?


编辑:

以上是我想要做的简化。如果有人想知道我为什么要这样做,那么解释如下:

这就像我想做的事情:

if(condition){
    $a=$arr1[0][0];
    $b=$arr1[0][1];
    $c=$arr1[0][2];
}
else{
    $a=$arr2[0];
    $b=$arr2[1];
    $c=$arr2[2];
}

我可以像这样压缩它:

if(condition)
    $arr=$arr1[0];
else
    $arr=$arr2;
$a=$arr[0];
$a=$arr[1];
$a=$arr[2];

但我想尝试使用可变变量来做到这一点:

if(condition)
    $arr="$arr1[0]";
else
    $arr="$arr2";
$a={$$arr}[0];
$b={$$arr}[1];
$c={$$arr}[2];

当然,我们不可need变变量,因为没有它们我们仍然可以编码。我想知道,为了学习 PHP,为什么代码不起作用。

4

4 回答 4

1

你试图做的只是行不通 - 代码$arr[0]引用了一个名为 的变量$arr,然后应用数组访问运算符 ( [$key]) 来获取带有 key 的元素0。没有变量被调用$arr[0],所以你不能用变量变量引用它,就像你不能用表达式一样$foo + 1

真正的问题是您为什么要这样做;变量变量通常是代码非常混乱的标志,并且可能是一些糟糕的数据结构选择。例如,如果您需要根据某些输入选择一组变量中的一个,您可能需要一个散列,并使用$hash[$item]或类似的方式查找一个项目。如果您需要更复杂的东西,一个switch声明通常可以涵盖您实际需要的情况。

如果由于某种原因您确实需要允许像$arr[0]输入一样的任意表达式并在运行时对其进行评估,您可以使用eval(),但要非常小心输入的来源,因为这可能是引入安全漏洞的一种非常简单的方法进入你的代码。

于 2013-05-05T19:05:35.380 回答
1

既然你说了你真正想要完成的事情:你的代码不起作用,因为如果你看$arr1[0][0],只有arr变量名;它们[0]是特定类型(如字符串或数组)的特殊访问器。

使用变量变量,您只能指定名称,但不能指定任何访问器或其他操作:

变量变量获取变量的值并将其视为变量的名称。

您使用附加变量保存数组以供以后访问的解决方案将是您问题的最佳解决方案。

于 2013-05-05T19:34:57.717 回答
0

来自 PHP 文档

为了在数组中使用可变变量,您必须解决歧义问题。也就是说,如果您编写,$$a[1]那么解析器需要知道您是否打算$a[1]用作变量,或者您是否想要$$a用作变量,然后是该变量的[1]索引。解决这种歧义的语法是:${$a[1]}第一种情况和${$a}[1]第二种情况。

利用

echo ${$a}[0]; // 123 

编辑:根据您的编辑,您可以简单地拥有

list($a, $b, $c) = (condition) ? $arr1[0] : $arr2;

或者

$array =  (condition) ? $arr1[0] : $arr2;
$a = $array[0];
$b = $array[1];
$c = $array[2];
于 2013-05-05T18:46:07.493 回答
0

正如所指出的,您不需要可变变量。要获取PHP variable variable name containing index(密钥),请使用array_keys()array_search()或其他数组解析器。从php的网站:

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');
$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

您还可以使用以下内容(使用$var=而不是 echo):

$arr[0]=123;
$arr[1]=456;
foreach ($arr as $key => $value) {
    echo "arr[{$key}] = {$value} \r\n";
}

哪个输出:

arr[0] = 123
arr[1] = 456

但我不明白你为什么要这样做,因为数组的重点不是在做那种事情。

于 2013-05-05T18:58:48.057 回答