2

给定一个具有通过数组“$a”的字符串路径的变量,无论如何可以访问数组“$a”吗?

例如:

$b = "['one']['1.1']";
$a = array(
    'one' => array(
        '1.1' => 'One point One',
        '1.2' => 'One point Two',
    ),
    'two' => array(
        '2.1' => 'Two point One',
        '2.2' => array(
            '2.2.1' => 'Two point Two point One',
        ),
    ),
);

echo ${$a.$b};

我尝试了 ${$a.$b} 和其他几种变体,有什么建议吗?

4

3 回答 3

2

正如所指出的那样,您有 eval() 选项,并且在适当的情况下,我个人不是 eval 仇恨者。

我只是想建议也许有更好的方法来处理您的问题。

现在我不明白变量 $b 是从哪里来的,但是如果你将它存储为 2 个变量,它似乎对你更有用,然后你可以直接使用它们来访问数组,例如:

  $b = 'one';
  $c = '1.1';
$a = array(
    'one' => array(
        '1.1' => 'One point One',
        '1.2' => 'One point Two',
    ),
    'two' => array(
        '2.1' => 'Two point One',
        '2.2' => array(
            '2.2.1' => 'Two point Two point One',
        ),
    ),
);

echo $a[$b][$c];

如果您无法控制变量 $b,或者您正在使用它来描述变量深度的数组,您可以将其结构简化为“one-1.1”或“one-two-1.1”之类的东西,并将变量解析为您需要的索引。

例如 :

    $b = 'one-1.1';

$a = array(
    'one' => array(
        '1.1' => 'One point One',
        '1.2' => 'One point Two',
    ),
    'two' => array(
        '2.1' => 'Two point One',
        '2.2' => array(
            '2.2.1' => 'Two point Two point One',
        ),
    ),
);

function resolveArray($path, $array)
{    
    $indexes = explode('-', $path);
    $depth = count($indexes);

    $target = $array;

    for($i = 0; $i < $depth; $i++)
    {
        $target = $target[$indexes[$i]];
    }

     return $target;   
}

echo resolveArray($b, $a);

您可以修改上述内容以处理您的问题中描述的路径。

于 2013-04-09T20:15:52.697 回答
0

不,没有您想要的内置快捷方式。你可以尝试使用eval(),但我真的不推荐它

于 2013-04-09T19:48:56.707 回答
0

您可以eval用于此目的。但是,请注意,可能有更好的方法来做您所做的事情,并且eval()应该对放入的任何东西进行良好的消毒。

eval("echo \$a$b;");
于 2013-04-09T19:51:36.687 回答