我有一个数组,有一个我可以通过
访问的子数组$fund['ManagersSets'][0]['PortfolioDate'];
我想为数组键使用字符串变量。类似的东西:
$key = "'ManagersSets'][0]['ManagerBreakdowns'";
print_r($fund[$key]);
但是在运行它时会得到一个未定义的索引通知。有没有办法做到这一点?
答案 0 :(得分:3)
它必须是一个字符串吗?你可以这样做:
$key = array('ManagerSets', 0, 'ManagerBreakdowns');
$result = $fund;
foreach($key as $index)
$result = $result[$index];
print_r($result);
这看起来相当古怪而且不太安全,但如果你必须这样做,你可以。
如果您确实需要字符串,可以使用explode
或preg_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
。这只是一个小例子,我让你想象一下黑客能用这种力量做些什么。