题
这是我的预言
$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()
已经保留了此功能,因此我的新代码也应该这样做。
解决方案
这是一个完整的代码示例,显示其工作原理。重要的是,您使用对数组的引用,因此可以对其进行修改:
<?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);
?>
其他提示
请注意,下面的代码(您评估)将产生警告,因此将不适用于最大报告错误的项目:
$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;
编辑:通过避免警告和冲突进行纠正。
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)
}
}
}
}
不隶属于 StackOverflow