PHP变量名包含索引

时间:2013-05-05 18:43:43

标签: php

$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 个答案:

答案 0 :(得分:1)

您尝试做的只是不起作用 - 代码$arr[0]引用一个名为$arr的变量,然后应用数组访问运算符([$key])来获取键为0的元素。没有名为$arr[0]的变量,因此您无法使用变量变量引用它,而不能使用表达式$foo + 1

真正的问题是你想要这样做的原因;变量通常是代码非常混乱的标志,可能是数据结构的一些不良选择。例如,如果您需要根据某些输入选择一组变量中的一个,则可能需要哈希,并使用$hash[$item]或类似内容查找项目。如果您需要更复杂的内容,switch语句通常可以涵盖您实际需要的案例。

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

答案 1 :(得分:1)

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

使用variable variables,您只能指定名称,但不能指定任何访问者或其他操作:

  

变量变量采用变量的值并将其视为变量的名称。

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

答案 2 :(得分:0)

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

答案 3 :(得分: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

但是我不明白为什么你这样做,因为数组的重点并不是那样做的。