$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f"));
$second = array("b", "d", "f");
$string = "foobar";
鉴于上述代码,如何在$first
中将$second
中定义的索引中的值设置为$string
的内容?意思是,对于此示例,它应该是$first["b"]["d"]["f"] = $string;
,但$second
和$first
的内容可以是任意长度。 $second
永远是一维的。这是我尝试过的,似乎没有按计划运作:
$key = "";
$ptr = $first;
for($i = 0; $i < count($second); $i++)
{
$ptr &= $ptr[$second[$i]];
$key = key($ptr);
}
$first[$key] = $string;
这将执行$first["f"] = $string;
而不是正确的多维索引。我原以为使用key
会找到数组中的位置,包括它已经向下移动的位置。
如何动态访问正确的密钥?如果维度的数量是静态的,我可以管理它。
编辑:另外,我想要一种不使用eval
的方法。
答案 0 :(得分:9)
比这复杂一点。如果尚未存在,则必须初始化每个级别。但你的实际问题是:
$ptr
,而不是$first
。$x &= $y
是$x = $x & $y
(按位AND)的简写。你想要的是x = &$y
(通过引用分配)。这应该这样做:
function assign(&$array, $keys, $value) {
$last_key = array_pop($keys);
$tmp = &$array;
foreach($keys as $key) {
if(!isset($tmp[$key]) || !is_array($tmp[$key])) {
$tmp[$key] = array();
}
$tmp = &$tmp[$key];
}
$tmp[$last_key] = $value;
unset($tmp);
}
用法:
assign($first, $second, $string);