如何将变量用作多维关联数组键?

时间:2017-09-26 13:00:41

标签: php

我有一个数组,有一个我可以通过

访问的子数组
$fund['ManagersSets'][0]['PortfolioDate'];

我想为数组键使用字符串变量。类似的东西:

$key = "'ManagersSets'][0]['ManagerBreakdowns'";
print_r($fund[$key]);

但是在运行它时会得到一个未定义的索引通知。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

它必须是一个字符串吗?你可以这样做:

$key = array('ManagerSets', 0, 'ManagerBreakdowns');
$result = $fund;
foreach($key as $index)
  $result = $result[$index];
print_r($result);

这看起来相当古怪而且不太安全,但如果你必须这样做,你可以。

如果您确实需要字符串,可以使用explodepreg_split轻松地将其转换为数组。

再次我不建议您使用此功能。以不同方式订购数据可能会更好。

答案 1 :(得分:1)

只需使用三个索引变量:

list($ix_set, $ix_num, $ix_field) = ['ManagersSets', 0, 'PortfolioDate']; 
$value = $fund[$ix_set][$ix_num][$ix_field];

答案 2 :(得分:0)

使用您的专栏print_r($fund[$key]);您从PHP要求的是从阵列基金访问密钥'ManagersSets'][0]['ManagerBreakdowns',该密钥不存在。有一个键ManagersSets但没有键'ManagersSets'][0]['ManagerBreakdowns'

你不能让PHP在一个指令中从一个数组中访问一系列可变索引。

可以做什么,但不应该做如果你想实现类似这样的事情,就像这样调用eval()

$fund = ['ManagersSets' => [['PortfolioDate' => "2017-09-26"]]];
$fund['ManagersSets'][0]['ManagerBreakdowns'] = [1, 2, 3];

$key = "'ManagersSets'][0]['ManagerBreakdowns'";
print_r(eval('return $fund[' . $key. '];'));

上面的代码将打印

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

但是你不应该这样做的原因是,如果$key变量中的值依赖于用户输入,如果有人设法将恶意代码放入其中,它将按原样执行。

例如,如果

$key = "'ManagersSets'] &&
    file_put_contents('/tmp/test', 'Oops!') ||
    \$fund['ManagersSets'";

尝试执行print_r(eval('return $fund[' . $key. '];'));会导致打印1 撰写"糟糕!"在/tmp/test。这只是一个小例子,我让你想象一下黑客能用这种力量做些什么。