PHP变量包含索引的变量名


PHP variable variable name containing index

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

但是我想尝试使用变量variable:

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

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

现在你说了你实际上想要完成的:你的代码不起作用,因为如果你看$arr1[0][0],只有arr是变量名;[0]是特定类型(如字符串或数组)的特殊访问器。

对于变量变量,您只能指定名称,而不能指定任何访问器或其他操作:

变量变量接受变量的值,并将其作为变量的名称。

你的解决方案与额外的变量保存数组以后访问将是你的问题的最佳解决方案。

你想做的只是不会工作-代码$arr[0]引用一个名为$arr的变量,然后应用数组访问操作符([$key])来获取键0的元素。没有名为$arr[0]的变量,因此您不能像使用表达式$foo + 1一样使用变量-变量来引用它。

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

如果出于某种原因,您确实需要允许像$arr[0]这样的任意表达式作为输入,并在运行时对其求值,则可以使用eval(),但要非常非常小心输入的来源,因为这很容易在代码中引入安全漏洞。

FROM PHP DOC

为了在数组中使用可变变量,必须解决歧义问题。也就是说,如果您编写$$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];

如上所述,您不需要可变变量。要获取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

但是我不明白你为什么要这样做,因为数组的整个意义并不是这样的