这是我的预制...
$keys = array('a', 'b', 'c', 'd');
$number = 10;
这是我的代码......
eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;');
使用这个,我得到以下结果......
Array (
[a] => Array
(
[b] => Array
(
[c] => Array
(
[d] => 10
)
)
)
)
现在,问题是这是我想要的确切结果,但我不想使用eval()
。
作为我的代码的输入,我有一个keys
和一个number
的列表。 number
应设置为keys
数组的值,该数组用于为特定数组keys
生成基于子项的$array
。
我能以不同的方式实现这一目标吗?我不想在代码有效的情况下用新值覆盖键/数字 - eval()
已经保留了它,所以我的新代码也应该这样做。
答案 0 :(得分:3)
请注意,下面的代码(您评估的代码)会生成警告,因此不会对错误报告最多的项目起作用:
$array = array();
$array['a']['b'] = 42; // $array['a'] is not an array... yet
由于您使用的是PHP 5,因此您可以在遍历要修改的树分支时使用引用来操作数组。
$current = & $array;
foreach ($keys as $key):
if (!isset($current[$key]) || !is_array($current[$key]))
$current[$key] = array();
$current = & $current[$key];
endforeach;
$current = $value;
编辑:已针对避免警告和冲突进行了更正。
答案 1 :(得分:1)
这是一个完整的代码示例,展示了它的工作原理。重要的是你使用对数组的引用,以便你可以修改它:
<?php
$keys = array('a', 'b', 'c', 'd');
$number = 10;
$org_array = array(
"a" => "string",
"z" => array( "k" => false)
);
function write_to_array(&$array, $keys, $number){
$key = array_shift($keys);
if(!is_array($array[$key])) $array[$key] = array();
if(!empty($keys)){
write_to_array($array[$key], $keys, $number);
} else {
$array[$key] = $number;
}
}
write_to_array($org_array, $keys, $number);
print_r($org_array);
?>
答案 2 :(得分:1)
function deepmagic($levels, $value)
{
if(count($levels) > 0)
{
return array($levels[0] => deepmagic(array_slice($levels, 1),
$value));
}
else
{
return $value;
}
}
$a = deepmagic(Array('a', 'b', 'c', 'd'), 10);
var_dump($a);
输出:
array(1) {
["a"]=>
array(1) {
["b"]=>
array(1) {
["c"]=>
array(1) {
["d"]=>
int(10)
}
}
}
}