如何动态访问可变多维数组中的值

Cyc*_*one 6 php multidimensional-array

$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f"));
$second = array("b", "d", "f");
$string = "foobar";
Run Code Online (Sandbox Code Playgroud)

鉴于上面的代码,我怎么能在设定的值$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;
Run Code Online (Sandbox Code Playgroud)

这将$first["f"] = $string;取代适当的多维索引.我以为使用key会找到数组中的位置,包括它已经向下移动的级别.

如何动态访问正确的密钥?如果尺寸的数量是静态的,我可以管理这个.

编辑:另外,我想要一种不使用的方法eval.

Fel*_*ing 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);
}
Run Code Online (Sandbox Code Playgroud)

用法:

assign($first, $second, $string);
Run Code Online (Sandbox Code Playgroud)

DEMO